如何在 Dart 2 - Flutter 中限制 TextEditingController 侦听器事件

Vic*_*ves 3 flutter dart-2

我想知道是否有一些我可能错过的内置功能。我试图找到类似的东西,但我找到的唯一包(throttle)不再支持 Dart 2

这是我想要限制的代码部分

final TextEditingController _filter = new TextEditingController();
String _searchText = "";

_filter.addListener(() {
      if (_filter.text.isEmpty) {
        setState(() {
          _searchText = "";
        });
      } else {
        setState(() {
          _searchText = _filter.text;
        });
      }
      //This action is being fired TOO many times :(
      widget.onUpdateSearchTerm(_searchText);
    });
Run Code Online (Sandbox Code Playgroud)

对此有什么想法吗?

Gün*_*uer 5

我会使用throttledebounce来自rxdart

在 rxdart 0.22.x 上使用Observable

final TextEditingController _filter = new TextEditingController();
String _searchText = "";
final _textUpdates = StreamController<String>();

_filter.addListener(() => _textUpdates.add(_filter.text));

Observable(_textUpdates.stream)
.throttle(const Duration(milliseconds: 700))
.forEach((s) {
  if (s.isEmpty) {
    setState(() {
      _searchText = "";
    });
  } else {
    setState(() {
      _searchText = s;
    });
  }
  //This action is being fired TOO many times :(
  widget.onUpdateSearchTerm(_searchText);
});
Run Code Online (Sandbox Code Playgroud)

在 rxdart 0.23.x 及更高版本上

final TextEditingController _filter = new TextEditingController();
String _searchText = "";
final _textUpdates = StreamController<String>();

_filter.addListener(() => _textUpdates.add(_filter.text));

_textUpdates.stream
.throttle(const Duration(milliseconds: 700))
.forEach((s) {
  if (s.isEmpty) {
    setState(() {
      _searchText = "";
    });
  } else {
    setState(() {
      _searchText = s;
    });
  }
  //This action is being fired TOO many times :(
  widget.onUpdateSearchTerm(_searchText);
});
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 谢谢 - 已修复。在没有 IDE 的情况下编写代码总是有点挑战 :D (2认同)