【问题标题】:Update streams based on filters in Dart/Flutter基于 Dart/Flutter 中的过滤器更新流
【发布时间】:2019-01-26 14:14:50
【问题描述】:

我有一个 BLoC,它使用原始输入 Stream(生成 JSON 对象列表)并使用 StreamTransformer 将其转换为可用对象。 UI 显示该列表。用户可以应用过滤器(本身是 BLoC 中的流),以便 BLoC 使用相应的where(...) 语句更新输入流转换器。

问题是:当过滤器更改时,UI 不会更新,因为输出流依赖于 JSON 输入流的事件,而不是过滤器流。我的假设是我需要创建自己的流,将输入事件和过滤器事件都转发到其中,或者我需要在转换后的输入流上重复最后一个事件,以便转换器有机会接收它。这是如何正确完成的?举个例子会有很大帮助!

【问题讨论】:

  • 我删除了“常见场景没有找到它”的东西。一般来说,尽量只提出有助于回答的问题。这些内容实际上无缘无故地阻碍了读者。

标签: stream dart flutter


【解决方案1】:

你的假设是正确的。您需要创建第三个流,接收 JSON 和 Filter 流并将两者组合成自定义结果。

这通常使用 Stream 转换器完成。使用myStream.transform 方法。但这有点复杂。

为了让事情变得更简单,有一个名为rxdart 的包,它基本上是Stream 的子类,并添加了一些常见的转换器。

使用 rxdart,您可以使用 combineLatest 运算符创建第三个流

Observable<List<String>> list;
Observable<String> filter;

final output = Observable.combineLatest2(filter, list, (String filter, List<String> list) {
  return list.where((str) => str.startsWith(filter));
});

更多关于reactivex操作符的信息here

【讨论】:

  • 谢谢!我似乎没有运气使用withLatestFrom。看看这个marbe diagram,似乎我需要的是combineLatest,因为我需要在任一流触发时更新流,而不仅仅是一个。但是我在 Dart 中找不到等效的方法。
  • 我的错。使用combineLatest 示例修复
  • 完美,非常感谢!链接到 reactivex 文档的奖励积分。
猜你喜欢
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多