Как вернуть список объектов в потоке при флаттере

У меня ниже структура хранилища огня и метод получения пользовательского фида из БД.

Мне нужно связать свой поток, например

  1. Сначала весь идентификатор канала из коллекции User / FeedIDs

  2. Затем для каждого идентификатора канала получите документы с подробностями канала и вернитесь к их списку.

Я мог бы найти способ решить эту проблему, потому что toList() не работает или я что-то делаю не так.

// User Collection
- User
   - RandomDocumentID
      - Feed
         - FeedIDasDocumentID
           - field1
           - field2
             .
             .

// Feed Collection
- Feed
   - RandomDocumentID
      - field1
      - field2
        .
        .

// Method in my repository to get feed for User
Observable<Feed> getCurrentUserFeed(String uid) {
    return Observable(Firestore.instance
          .collection('User')
          .document(uid)
          .collection("FeedIDs")
          .snapshots()
          .expand((snapshots) => snapshots.documents)
          .map((document) => UserFeed.fromMap(document.data))
        )
        .flatMap((userFeed) => Firestore.instance
                               .collection("Feed")
                               .document(userFeed.id)
                               .snapshots()
        )
        .map((document) => Feed.fromMap(document.data));
        // ????
        // I tried to put .toList() and of the stream but it is not working, 
       // i wanna return List<Feed> instead of every single feed object
  }


// in my BLoC
// I had to do that because I could acquire to get streams elements as a list
// 
List<Feed> feedList = List();
FirebaseUser user = await _feedRepository.getFirebaseUser();
_feedRepository.getCurrentUserFeed(user.uid).listen((feed) {
    feedList.add(feed);
    dispatch(UserFeedResultEvent(feedList));
 };

Если есть какой-либо другой подход к цепочке, мы будем очень признательны за его использование. Спасибо


person Talha    schedule 25.12.2018    source источник
comment
Вы уже используете stream.map, который является ответом на цепочку вычислений для элементов в Stream. Я думаю, ваш вопрос лучше сформулировать так: Почему поток из Firestore не генерирует событие done? Я думаю, что поток snapshots предназначен, чтобы никогда не заканчиваться, потому что он сигнализирует, когда коллекция получает обновления. Возможно, вы захотите .snapshots().first() получить список текущих документов.   -  person Nate Bosch    schedule 28.12.2018
comment
Спасибо, @NateBosch за этот совет. Собственно, есть два вопроса. Второй - почему onDone не излучается, как вы сказали, это непрерывный поток, поэтому он не излучается. Я использовал .single (), чтобы исправить это. Второй вопрос: подумайте, что у пользователя 5 каналов, и я хочу вернуть список каналов вместо того, чтобы возвращать каждый канал. У вас есть идеи, потому что .toList (). не работает?   -  person Talha    schedule 29.12.2018
comment
Причина, по которой .toList() никогда не завершится, заключается в отсутствии события done. .single() тоже не будет полным, как я ожидал. .first должен быть завершен.   -  person Nate Bosch    schedule 02.01.2019
comment
Спасибо! Думаю, это ответ на вопрос. Если вы напишете это как ответ, я его приму.   -  person Talha    schedule 03.01.2019


Ответы (1)


Я думаю, проблема здесь в том, что Firestore настроен на отправку обновлений при изменении записей. Когда вы запрашиваете snapshots, это Stream, который никогда не отправит событие done, потому что всегда могут появиться новые обновления.

Некоторые методы Stream, возвращающие Future, никогда не будут завершены, если поток не отправит событие done. К ним относятся .single и .toList(). Вероятно, вы ищете .first, который завершится после того, как первое событие будет отправлено через поток (текущее состояние записей в базе данных), и перестанет прослушивать изменения.

person Nate Bosch    schedule 04.01.2019