Поиск в ListView эффективно - PullRequest
       6

Поиск в ListView эффективно

0 голосов
/ 19 сентября 2018

У меня есть ListView, и у меня есть поиск TextField.Когда пользователь ищет что-либо, ListView должен быть отфильтрован.Я реализовал примерно так, как показано ниже, и это работает.

Я хочу знать, можно ли сделать это более эффективно.

Кроме того, я также хочу знать, можно ли избежать вызова setState в onChanged из TextField после того, как была выполнена фильтрация по dataCopy.

Я имею в виду, что dataCopy рендеринг моего ListView не должен отражать изменения в нем, которые отражаются непосредственно в представлении, почему я все еще должен сказать флаттеру обновить состояние моего дерева?

Примечание. Я хочу выполнять поиск локально, а не асинхронно.Для краткости я не пишу здесь полный код, но он выглядит примерно так:

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => new _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  List<String> data = [];
  List<String> dataCopy = [];
  @override
  Widget build(BuildContext context) {
    data = dataCopy = getDataAsynchronously();
    return Column(
      children: <Widget>[
        TextField(
          onChanged: (text) {
            dataCopy.clear();
            for (String s in data)
              if (s.toLowerCase().contains(text.toLowerCase()))
                dataCopy.add(s);
            setState(() {}); // can I avoid calling this ?
          },
        ),
        Container(
          child: ListView.builder(
            itemCount: dataCopy.length,
            itemBuilder: (context, i) {
              return ListTile(
                title: Text(
                  dataCopy.text,
                ),
              );
            },
          ),
        )
      ],
    );
  }
}
...