Как вернуть список объектов в потоке на флаттер - PullRequest
0 голосов
/ 25 декабря 2018

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

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

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

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

Я мог бы найти способчтобы решить это, потому что 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));
 };

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

1 Ответ

0 голосов
/ 04 января 2019

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

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

...