在文本字段中暂停后如何执行onchanged?

时间:2018-10-07 16:53:05

标签: flutter

TextField的文本被更改但暂停后是否可以执行事件。

假设我有一个搜索框,但是我不想在用户输入每个字母后更改搜索数据,而是仅在用户输入并暂停了一段时间后才进行搜索。

2 个答案:

答案 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]),
  )

  // ...
}