如何在一个BLOCK中组合多个数据流?

问题描述 投票:0回答:4

我有一个小部件来表示按最近用户当前位置排序的商店列表,也应该应用过滤。

数据在:

  1. 存储来自Firestore集合流的数据
  2. geolacator的当前用户位置。
  3. 从共享首选项中过滤选项(可以随时更改)
  4. 列出用户选择的排序模式

数据输出:过滤,排序,商店列表。

在这种情况下,最佳做法是什么模式?

dart stream flutter
4个回答
2
投票

rxdart:https://pub.dartlang.org/packages/rxdart如果你想将数据组合在一起就可以使用了

var myObservable = Observable.combineLatest3(
myFirstStream, 
mySecondStream, 
myThirdStream, 
(firstData, secondData, thirdData) => print("$firstData $secondData $thirdData"));    


you can combine from ( combineLatest2, combineLatest... combineLatest9 )

或者像这个例子一样使用CombineLatestStream

     CombineLatestStream.list<String>([
        Stream.fromIterable(["a"]),
        Stream.fromIterable(["b"]),
        Stream.fromIterable(["C", "D"])])
        .listen(print);

0
投票

数字2,3和4是您通过接收器发送的块的输入。该bloc侦听这些接收器并相应地更新Firestore查询。仅此一项就足以使Firestore将适当的快照发送到窗口小部件正在侦听的输出流。

如果您无法直接使用Firestore API对其进行排序或过滤,则可以使用stream.map或在其上应用StreamTransformer。通过实现bind方法,变换器为您提供了很大的灵活性来监听流并更改或忽略事件。

所以你可以这样做:

Stream<Store> get stores => _firestoreStream
  .transform(filter)
  .transform(sort);

一般来看看qazxsw poi中的dart流,并查看qazxsw poi以获得更复杂的流操作。


0
投票

根据个人经验,我发现有一个块的多个输入导致难以测试代码。块内的隐式并发问题导致混乱的场景。

我在this page帖子中构建它的方法是创建一个单独的输入流,但是在消息中添加标记,表明消息是哪个数据流的一部分。它使测试理智。


0
投票

在这种情况下,我认为有多个异步处理。这种实现可能很复杂。并且存在竞争条件的可能性。

我将按如下方式实施。

  1. 从Firestore中分离出Model的流,在Bloc中将用户可见的ViewModel分开。小部件仅侦听ViewModel。(例如,使用StreamBuilder)
  2. 仅在Bloc中限制业务逻辑处理。首先,使用SharedPreferences将处理重定位到Bloc。
  3. 仅为用户输入创建UserControl类。
  4. 分支处理取决于扩展UserControl的用户输入类型

我希望你能帮助你。

例如:

rxdart
© www.soinside.com 2019 - 2024. All rights reserved.