FutureBuilder的嵌套期货

时间:2019-08-10 17:03:46

标签: firebase flutter dart google-cloud-firestore

我有一个FutureBuilder小部件,应等待Firestore集合中的数据。

class MyScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: calendarQuery.getCalendarEntry(dateString),
      builder: (BuildContext context, AsyncSnapshot snap) {
        if (snap.hasData) {
          List<Events> recipe = snap.data;
          return Scaffold(
            appBar: AppBar(
              title: Text("Events"),
            ),
            body: Column(
              children: <Widget>[
                ...,
              ],
            ),
          );
        } else {
          return LoadingScreen();
        }
      },
    );
  }
}

我检索事件列表,然后对于每个事件,我需要获取一些其他详细信息。我试图做嵌套的期货,并想出了下面的代码。它会生成一个Future<Iterable<Future<Detail>>>,它在MappedListIterable<DocumentSnapshot,Future<Recipe>>中以snap.data结尾,而我无法处理它。

class CalendarQuery<T> {
  ...

  Future<Iterable<Future<Detail>>> getCalendarEntry(String date, String type) async {
    return await ref
        .where("date", isEqualTo: date)
        .getDocuments()
        .then((data) {
      return data.documents.map((doc) => Document<Details>(path: 'detailCollection/${doc.data["Event"]["SomeId"]}')
                .getData());
    });
  }
}

我认为在某些时候我在处理期货方面犯了错误,并且可能有适当的方法来做到这一点。

有人知道重构getCalendarEntry以便返回Future<List<T>>的方法吗?或者也许有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用Future.wait创建一个期货,一旦来自Iterable的所有期货都完成,该期货便完成。

在您的方案中,您可以将return await ref替换为return Future.wait(ref,并在需要时使用右括号,以创建一个Future,它等待所有Details的检索。