Как выполнить замену после паузы в текстовом поле? (Флаттер) - PullRequest
0 голосов
/ 07 октября 2018

Возможно ли выполнить событие, когда текст TextField изменен, но после паузы.

Предположим, у меня есть окно поиска, но я не хочу изменять данные поиска послепользователь вводит каждую букву, но вместо этого поиск должен выполняться только в том случае, если пользователь ввел и сделал паузу на некоторое время.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Гюнтер прав в использовании функции debounce, но та, что в RxDart, работает только для Observable s (как он указал, вы можете конвертировать события onChanged в поток и идти по этому пути).Вы также можете легко реализовать свою собственную функцию для принятия любой функции.

// Define this function somewhere
import 'dart:async';

// This map will track all your pending function calls
Map<Function, Timer> _timeouts = {};
void debounce(Duration timeout, Function target, [List arguments = const []]) {
  if (_timeouts.containsKey(target)) {
    _timeouts[target].cancel();
  }

  Timer timer = Timer(timeout, () {
    Function.apply(target, arguments);
  });

  _timeouts[target] = timer;
}

Затем вы можете использовать ее так же, как и в своем виджете

void _onChanged(String val) {
  // ...
}

Widget build(BuildContext context) {
  // ...

  TextField(
    // ...
    onChanged: (val) => debounce(const Duration(milliseconds: 300), _onChanged, [val]),
  )

  // ...
}
0 голосов
/ 07 октября 2018

Вы, вероятно, хотите что-то вроде debounce, предоставленное https://pub.dartlang.org/documentation/rxdart/latest/rx/Observable/debounce.html

new Observable.range(1, 100)
  .debounce(new Duration(seconds: 1))
  .listen(print); // prints 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...