firebase - 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>>
吗?或者也许有更好的方法来解决这个问题?
解决方案
您可以使用Future.wait
来创建一个 Future,它会在来自 an 的所有 Future 完成后Iterable
完成。
在您的场景中,您将在需要的地方替换return await ref
为return Future.wait(ref
和右括号,以创建一个等待所有内容Details
被检索的 Future。
推荐阅读
- jquery - JQuery 2-modal 冲突:需要“删除”animatedModal,但要使用 DELAY,以隐藏第二个模态的滚动条
- postgresql - 在postgresql中加入删除
- chatbot - 如何让我的聊天机器人只在下午 6 点到早上 8 点回答 - IBM Watson
- networkx - Draw Networkx Directed Graph using clustering labels as color scheme
- makefile - 为 FPGA 项目-Vivado 执行 Makefile 时出现问题
- c++ - 保存是在我的 vscode 代码中使“\n”在 c++ 中换行
- javascript - Sequelize:如果这些注册表之一具有特定密钥,我想返回与模型关联的所有注册表
- python - 在 Python 中合并数据集,类似于交叉连接
- c - 运行我的程序时出现分段错误(核心转储)错误
- sql - 如何使用 UNION 用另一个表中的值填充 NULL 值