【问题标题】:Firestore: merge 2 Streams and emit both valuesFirestore:合并 2 个流并发出两个值
【发布时间】:2023-03-26 09:29:01
【问题描述】:

我有 2 个 Firestore 查询并希望将它们合并到一个可以使用 StreamBuilder 显示的流中。

StreamGroup 不适合我,因为它只发出最新发出的流的值。 StreamZip 也不适合我,因为它会压缩 Stream 的值,例如标题和帖子,但返回的 QueryResult 的长度可能不等于另一个,如果最短的 Stream 超出索引,两个流都会停止。

这里有一些虚拟/伪代码:

Stream query1 = Some FirestoreQuery; 
Stream query2 = Some FirestoreQuery;

Stream mergedQuerys = merge([Query1, Query2])

mergedQuerys.listen((mergedQueryDocs) {
   print(mergedQueryDocs)
})

query1.emit([1,2,3])
//Output should be => [1,2,3]

query2.emit([4,5,6])
//Output should be => [1,2,3,4,5,6]

query1.emit([])
//Output should be => [4,5,6]

我只想合并它们,如果 2 个基础 Stream 之一发出它应该将两个值都发送到新 Stream。

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    您可以为此使用rxdart 包:

    Stream query1 = Stream.fromIterable([1,2,3]);
    Stream query2 = Stream.fromIterable([4,5,6]);
    
    // Will emit all items in query1, then all items in query2.
    Stream mergedQueries = Observable.concat([query1, query2]);
    
    // Will emit all items in query1 or query2, whichever item comes first.
    Stream mergedQueries = Observable.merge([query1, query2]);
    

    选择哪个运算符取决于您是否要保留严格的顺序。但是如果使用concat query1 必须在query2 能够发射项目之前终止。因此,对于(可能)无限查询订阅的情况,我认为您应该使用merge 运算符——当query1query2 流发出项目时,它将由mergedQueries 发出。

    【讨论】:

    • 非常感谢您帮助我!我已经使用 StreamBuilder Widget 尝试了这两种解决方案,并且得到了相同的结果。会不会是 StreamBuilder 阻止了我归档我想要的东西?
    • @MarcMa 你能提供你的小部件的代码和预期/实际结果吗?否则很难说是什么问题。
    【解决方案2】:

    再次感谢您的帮助。但我现在解决了。

    我的解决方案: 订阅 initState() 中的 2 个 Stream,在 ListView 中创建 2 个按顺序呈现的列表。让这 2 个流更新其他列表并调用 setState()。不要忘记关闭 Streams!

    StreamBuilder 只选择了最新的发射流的值,这是一个意外的行为......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-16
      • 2014-05-23
      • 2021-04-27
      • 2021-06-07
      • 1970-01-01
      • 2021-02-20
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多