Метод контроллера текстового поля замедляет производительность - PullRequest
1 голос
/ 12 марта 2019

Я фильтрую свой список моего 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 кадров в секунду.иногда, когда я удаляю текст или быстро набираю текст.

Это мой конструктор 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];
        }));

1 Ответ

0 голосов
/ 12 марта 2019

Всегда устанавливайте переменные состояния внутри вызова setState ().

Заставьте свою функцию onSearchTextChanged () сохранить текст поиска и запустить Future.delayed (), который выполняет поиск и обновление после небольшой задержки. См .: https://stackoverflow.com/a/54686588/1736338.

Вы можете использовать структуру данных Suffix Tree , чтобы ускорить поиск. К сожалению, я не смог найти ни одного написанного на Дартланге. Вы могли бы кодировать один. Пакет trie не подходит, так как он поддерживает только функциональные возможности Set, но не Map.

...