Dart / Flutter - «доходность» внутри функции обратного вызова - PullRequest
2 голосов
/ 01 мая 2019

Мне нужно получить список для функции;однако я хочу получить список из функции обратного вызова, которая сама находится внутри главной функции - это приводит к тому, что оператор yield выполняется не для основной функции, а для функции обратного вызова.

Моя проблемаочень похоже на проблему, которая была решена здесь: Компонент Dart: Как вернуть результат асинхронного обратного вызова? , но я не могу использовать Completer, потому что мне нужно уступать, а не возвращать.

код ниже должен лучше описать проблему:

Stream<List<EventModel>> fetchEvents() async* { //function [1]
    Firestore.instance
        .collection('events')
        .getDocuments()
        .asStream()
        .listen((snapshot) async* { //function [2]
      List<EventModel> list = List();
      snapshot.documents.forEach((document) {
        list.add(EventModel.fromJson(document.data));
      });

      yield list; //This is where my problem lies - I need to yield for function [1] not [2]
    });
  }

1 Ответ

4 голосов
/ 01 мая 2019

Вместо .listen, который обрабатывает события внутри другой функции, вы можете использовать await for для обработки событий внутри внешней функции.

Отдельно - вы можете захотеть пересмотреть шаблон, когда вы получите List экземпляровкоторые все еще заполняются внутри обратного вызова внутреннего потока ...

Stream<List<EventModel>> fetchEvents() async* {
  final snapshots =
      Firestore.instance.collection('events').getDocuments().asStream();
  await for (final snapshot in snapshots) {
    // The `await .toList()` ensures the full list is ready
    // before yielding on the Stream
    final events = await snapshot.documents
        .map((document) => EventModel.fromJson(document.data))
        .toList();
    yield events;
  }
}
...