Concanete 2 firestore потоки QuerySnapShot в dart-flutter от RxDart - PullRequest
0 голосов
/ 12 июля 2020

В моем проекте Flutter есть виджет StreamBuilder. Он прослушивает поток снимков запросов к хранилищу . Если я использую только один поток запросов, проблем нет, все работает так, как я ожидал. Но если я объединю 2 потока, он будет слушать только первый поток. Я думаю, stream1 не передает все данные, поэтому stream2 не добавляется к потоку результатов. Но я не знаю, как решить эту проблему.

Я ценю любую помощь. спасибо.

Stream<List<MyLog>> myLogStream() {
    Stream<QuerySnapshot> stream1 = Firestore.instance
        .collection('devicelog/1/mylog')
        .snapshots();
    Stream<QuerySnapshot> stream2 = Firestore.instance
        .collection('devicelog/2/mylog')
        .snapshots();
    return Rx.concat([stream1, stream2]).map((qShot) => qShot.documents
        .map((doc) => MyLog.fromCloud(doc.documentID, doc.data))
        .toList());
}

1 Ответ

2 голосов
/ 13 июля 2020

Concat ждет, чтобы подписаться на каждый дополнительный Observable, который вы передаете ему, пока не завершится предыдущий Observable.

concat не будет читать stream2, пока stream1 не завершится

Concat не будет видеть и, следовательно, не будет генерировать какие-либо элементы, которые Observable испускает до завершения всех предыдущих Observable

, поэтому он слушает только первый поток. потому что он должен завершить первый поток перед переходом к следующему, и к тому времени уже слишком поздно, потому что stream2 уже выпустил некоторые элементы source

то, что вы, вероятно, ищете, это Rx.combineLatest поэтому вы объединяете каждый объект, излучаемый stream1 stream2, в один объект, который передается в stream3

Stream<List<MyLog>> myLogStream() {
  Stream<QuerySnapshot> stream1 =
      Firestore.instance.collection('devicelog/1/mylog').snapshots();
  Stream<QuerySnapshot> stream2 =
      Firestore.instance.collection('devicelog/2/mylog').snapshots();
  return Rx.combineLatest2(stream1, stream2,
      _fun_That_Combines_Each_Object_From_stream1_And_stream2);
}

QuerySnapshot _fun_That_Combines_Each_Object_From_stream1_And_stream2(
    QuerySnapshot mylog1, QuerySnapshot mylog2) {
      // do some magic
    }
...