Flutter Stream работает только один раз при запуске приложения - PullRequest
0 голосов
/ 28 мая 2020

У меня есть поток, который работает, когда я впервые запускаю приложение в моем android эмуляторе, но затем заменяю его пустым, прежде чем ничего не вернуть, пока эмулятор не будет остановлен и перезапущен. Единственный способ заставить его снова выводить что-либо - это закрыть эмулятор и перезапустить его. Я был бы совершенно счастлив, если бы вместо потока асинхронная функция просто запускалась один раз и возвращала правильное содержимое всякий раз, когда виджет, частью которого она является, перестраивается. Любая помощь по устранению этой проблемы приветствуется.

  Stream<List<Memo>> getFeed() async* {

    List<Stream<List<Memo>>> streams = [];

    List<String> friends = await Firestore.instance.collection("users")
    .document(userid)
    .collection("friends")
    .snapshots().map(_snapshotToStringList).first;

      for (var i = 0; i < friends.length; i++) {
        streams.add(Firestore.instance.collection("memos")
        .where("owner", isEqualTo: friends[i])
        .snapshots()
        .map(_snapshotToMemoList));
      }

    yield* StreamGroup.merge(streams);
  }

Поток получен с

    return StreamProvider<List<Memo>>.value(
      value: dbService( user: widget.user ).getFeed(),
      child: SafeArea(
        child: TestList(),
      )
    );

Тогда в TestList

@override
  Widget build(BuildContext context) {
    final memos = Provider.of<List<Memo>>(context);
    print(memos);
    return (memos == null || memos.length == 0) ? Text('no content') :
        ListView.builder(
          itemCount: memos.length,
          itemBuilder: (BuildContext context, int index) {
          return Text(memos[index].body);
          }
        );
  }

Я новичок в трепете / dart, поэтому, пожалуйста, предполагайте, что в ваших рекомендациях / объяснениях мало предварительных знаний, или, в идеале, исправьте код, который у меня выше

1 Ответ

1 голос
/ 28 мая 2020

Пожалуйста, попробуйте заменить это

 for (var i = 0; i < friends.length; i++) {
        streams.add(Firestore.instance.collection("memos")
        .where("owner", isEqualTo: friends[i])
        .snapshots()
        .map(_snapshotToMemoList);
      }

следующим

yield Firestore.instance
        .collection('memos')
        .where('owner', whereIn: friends)
        .snapshots()
        .map(_snapshotToMemoList));

И у вас проблема со строкой final memos = Provider.of<List<Memo>>(context);, поскольку она принимает данные как null, когда ответ не получен, и запрос находится в состоянии ожидания. Попробуйте использовать StreamBuilder, чтобы справиться с этим. Отметьте это

...