首页 > 解决方案 > FutureBuilder 的嵌套期货

问题描述

我有一个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使其返回 aFuture<List<T>>吗?或者也许有更好的方法来解决这个问题?

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


您可以使用Future.wait来创建一个 Future,它会在来自 an 的所有 Future 完成后Iterable完成。

在您的场景中,您将在需要的地方替换return await refreturn Future.wait(ref和右括号,以创建一个等待所有内容Details被检索的 Future。


推荐阅读