我有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。
答案 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
运算符–当query1
或query2
流中的任何一个发出项目时,{{1 }}。
答案 1 :(得分:0)
再次感谢您的帮助。但是我现在解决了。
我的解决方案: 在initState()中订阅2个流,制作2个在ListView中按顺序呈现的列表。使这2个Stream更新其他List并调用setState()。不要忘记关闭流!
StreamBuilder只选择了最新发射流的值,这是意外行为...