Гюнтер прав в использовании функции 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]),
)
// ...
}