Dart / Flutter-回调函数中的“收益”

时间:2019-05-01 17:10:01

标签: dart flutter google-cloud-firestore dart-async

我需要产生一个函数列表;但是,我想从回调函数中产生列表,该回调函数本身在主函数内部-这导致yield语句不是针对主函数执行,而是针对回调函数执行。

我的问题与此处解决的问题非常相似:Dart Component: How to return result of asynchronous callback?,但是我不能使用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 个答案:

答案 0 :(得分:1)

您可以使用.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;
  }
}