Firestore: объединить 2 потока и испустить оба значения - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть 2 запроса Firestore, и я хочу объединить их в один поток, который можно отобразить с помощью StreamBuilder.

StreamGroup не для меня, потому что он выдает только значения последнего испущенного потока.StreamZip также не для меня, потому что он Zips значения потока, такие как title и post, но длина возвращаемого QueryResult может быть не равна другой, и оба потока остановятся, если самый короткий поток выйдет из индексов.

Вот некоторый фиктивный / псевдокод:

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 ]

0 голосов
/ 24 сентября 2019

Еще раз спасибо за помощь.Но я решил это сейчас.

Мое решение: подписаться на 2 потока в initState (), составить 2 списка, которые будут отображаться в порядке в ListView.Сделайте, чтобы эти 2 потока обновили другие списки и вызвали setState ().Не забудьте закрыть Streams!

StreamBuilder выбрал только значение последнего испускающего потока, что является неожиданным поведением ...

0 голосов
/ 23 сентября 2019

Для этого вы можете использовать пакет 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 выдается элемент, он будет выдан mergedQueries.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...