У меня есть 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,
),
);
},
),
)
],
);
}
}