Firestore:合并2个流并同时发射两个值

时间:2019-09-23 12:25:26

标签: firebase flutter dart google-cloud-firestore

我有2个Firestore查询,想将它们合并到可以使用StreamBuilder显示的单个Stream中。

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。

2 个答案:

答案 0 :(得分:0)

您可以使用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流中的任何一个发出项目时,{{1 }}。

答案 1 :(得分:0)

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

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

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