Как вернуть поток с помощью асинхронной* функции во Flutter

Я работаю над приложением для чата, используя Flutter и Firebase. Я новичок в Dart и поэтому застрял, когда хотел создать функцию, которая извлекает (используя ожидание) конкретный документ из одной коллекции (форумов) и использует свойство массива документа форума для запроса и возврата потока из другой коллекции ( открытые сообщения). Проблема с моим текущим решением заключается в том, что оно всегда возвращает пустой массив. Я уверен, что неправильно использую ключевые слова или логику. Не могли бы вы помочь мне реорганизовать мой метод.

Stream<List<ChatMessage>> getForumChatStream(String forumId) async* {
List<ChatMessage> messages = [];
var docSnap = await firestore.collection('forums').doc(forumId).get();
Forum forum = Forum.fromMap(docSnap.data()!);

firestore
    .collection('openMessages')
    .where('messageId', whereIn: forum.messageIds) 
    .orderBy('timeSent', descending: true)
    .snapshots()
    .map((event) {
        for (var document in event.docs) {
          messages.add(ChatMessage.fromMap(document.data()));
        }
    });
//print('LENGTH:'+messages.length.toString());
yield messages;}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать следующий метод.

  Stream<List<ChatMessage>> getForumChatStream(String forumId) async* {
    final firestore = FirebaseFirestore.instance;
    List<ChatMessage> messages = [];
    var docSnap = await firestore.collection('forums').doc(forumId).get();
    Forum forum = Forum.fromMap(docSnap.data()!);
    final result = firestore
        .collection('openMessages')
        .where('messageId', whereIn: forum.messageIds)
        .orderBy('timeSent', descending: true)
        .snapshots();
    await for (final r in result) {
      final docs = r.docs;
      for (final document in docs) {
        messages.add(ChatMessage.fromMap(document.data()));
        yield messages;
      }
    }
  }

Или

Stream<List<ChatMessage>> getForumChatStream(String forumId) async* {
  final firestore = FirebaseFirestore.instance;
  List<ChatMessage> messages = [];
  var docSnap = await firestore.collection('forums').doc(forumId).get();
  Forum forum = Forum.fromMap(docSnap.data()!);
  yield* firestore
      .collection('openMessages')
      .where('messageId', whereIn: forum.messageIds)
      .orderBy('timeSend', descending: true)
      .snapshots()
      .map((event) =>
          event.docs.map((e) => ChatMessage.fromMap(e.data())).toList());
}

Вы также могли бы взять вывод .snapshots и использовать для него соответствующую обработку .map и вернуть его как поток напрямую. Нет необходимости в асинхронной синхронизации с асинхронной передачей туда и обратно.

Randal Schwartz 08.11.2022 17:25

Другие вопросы по теме