首页 > 解决方案 > 文本字段控制器方法使性能变慢

问题描述

我正在过滤我的 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];
        }));

标签: performancegridviewdartflutteronchange

解决方案


始终在 setState() 调用中设置状态变量。

让您的 onSearchTextChanged() 函数保存搜索文本并启动 Future.delayed() 在短暂延迟后执行搜索和更新。请参阅:https ://stackoverflow.com/a/54686588/1736338 。

您可以使用后缀树数据结构来加快搜索操作。不幸的是,我找不到用 Dartlang 编写的。你可以编码一个。trie包不适合,因为它只支持 Set 功能,不支持 Map 功能。


推荐阅读