我有一个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>>
的方法吗?或者也许有更好的方法来解决这个问题?
答案 0 :(得分:1)
您可以使用Future.wait
创建一个期货,一旦来自Iterable
的所有期货都完成,该期货便完成。
在您的方案中,您可以将return await ref
替换为return Future.wait(ref
,并在需要时使用右括号,以创建一个Future,它等待所有Details
的检索。