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

Posted

技术标签:

【中文标题】如何在 Dart 2 中限制 TextEditingController 侦听器事件 - Flutter【英文标题】:How to throttle TextEditingController listener events in Dart 2 - Flutter 【发布时间】:2019-06-16 08:56:46 【问题描述】:

我想知道是否有一些我可能错过的内置功能。我试图找到类似的东西,但我找到的唯一包 (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);
    );

对此有什么想法吗?

【问题讨论】:

【参考方案1】:

我会使用来自rxdartthrottledebounce

在 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);
);

在 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);
);

另见

https://pub.dartlang.org/packages/rxdart https://pub.dartlang.org/documentation/rxdart/latest/rx/Observable/throttle.html https://pub.dartlang.org/documentation/rxdart/latest/rx/Observable/debounce.html

【讨论】:

工作就像一个魅力@@Günter Zöchbauer。非常感谢。但是,仅对 _filter.addListener(() => _textUpdates(_filter.text)); 行进行了一次更正,抱怨它不是 Function。然后我改为 _filter.addListener(() => _textUpdates.add(_filter.text)); 我建议你更新答案。除此之外,一切都很好! 谢谢 - 已修复。在没有 IDE 的情况下编写代码总是有点挑战:D

以上是关于如何在 Dart 2 中限制 TextEditingController 侦听器事件 - Flutter的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen

如何在 Dart 2 中使用材质角镖组件的排版?

如何在Dart中将列表转换为地图

如何在 Dart 中合并两个列表?

如何让 Dart 程序“休眠”1.6 秒

dart 中的节流函数执行