我正在过滤我的GridView.builder列表,如下所示:
onSearchTextChanged(String text) async {
if (text.isEmpty) {
_searchList = _productList.toList();
setState(() {
});
return;
}
_searchList = _productList.where((product) => product.name.toLowerCase().contains(text.toLowerCase()) ||
product.type.toLowerCase().contains(text.toLowerCase())).toList();
setState(() {});
}
但是当我在文本字段上输入时,性能会下降,有时当我删除文本或打字快速时,精确到2.5 fps。
这是我的Gridview构建器
GridView.builder(
primary: false,
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: itemWidth / itemHeight,
),
itemCount: _searchList.length,
itemBuilder: (BuildContext context, int index) {
return _searchList[index];
}));
始终在setState()调用中设置状态变量。
使你的onSearchTextChanged()函数保存搜索文本并启动Future.delayed(),在短暂的延迟后执行搜索和更新。见:https://stackoverflow.com/a/54686588/1736338。
您可以使用Suffix Tree数据结构来加速搜索操作。不幸的是,我找不到一个用Dartlang写的。你可以编码一个。 trie包不适合,因为它仅支持Set功能,而不支持Map功能。