TextField
的文本被更改但暂停后是否可以执行事件。
假设我有一个搜索框,但是我不想在用户输入每个字母后更改搜索数据,而是仅在用户输入并暂停了一段时间后才进行搜索。
答案 0 :(得分:0)
您可能想要https://pub.dartlang.org/documentation/rxdart/latest/rx/Observable/debounce.html提供的类似debounce
的东西
new Observable.range(1, 100) .debounce(new Duration(seconds: 1)) .listen(print); // prints 100
答案 1 :(得分:0)
Gunter关于使用去抖动功能是正确的,但是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]),
)
// ...
}