我在我的首页上构建了一个小部件,它依赖于我从 firebase 收到的信息。
因为如果没有数据库中的信息(日期、图片网址等),这个小部件就无法正确显示,所以在渲染这个小部件之前,必须完成两个 future(从数据库中获取数据)。
现在,我从首页的 setState 方法调用一个函数,该函数调用异步函数
getAllFutures()
,我在其中执行以下代码:
await Future.wait([
globals.checkExistingWochenplan(),
globals.getWochenplan(kw: 34)
]).then((value) {
print(value);
print("DONE");
});
根据我对
Future.wait
的理解(如果我错了请纠正我),这个方法在执行时会阻塞主线程,直到所有futures完成,这正是我想要的,因为我依赖数据。是对的吗?因为,当我查看调试控制台消息时,我的应用程序的其余部分会继续执行,而 Future.wait 中的 future 会被执行。
有人可以告诉我我在这里做错了什么/我正确使用
Future.wait
的天气吗?
.then
方法中的 print 语句随后返回 null
两次,但这可能是因为期货本身的原因。
我期待您的回复。
问候 悟空
Future.wait()
用于等待多个 future 完成并收集它们的结果。返回一个 future,一旦所有提供的 future 完成,该 future 就会完成,无论是其结果,还是在任何提供的 future 失败时都会出现错误。但你不应该混合使用 then
和 await
,最好使用其中一个/或来保持一致性。例如:
void main() {
Future.wait([delayedNumber(), delayedString()])
.then((value) {
print(value);
print("DONE");
});
print("printed first outside of future");
}
Future<int> delayedNumber() async {
await Future.delayed(const Duration(seconds: 2));
return 2;
}
Future<String> delayedString() async {
await Future.delayed(const Duration(seconds: 2));
return "result";
}
这会给你:
printed first outside of future
[2, result]
DONE
如果您使用
async/await
:
void main() async {
var value = await Future.wait([delayedNumber(), delayedString()]);
print(value);
print("printed at the end");
}
Future<int> delayedNumber() async {
await Future.delayed(const Duration(seconds: 2));
return 2;
}
Future<String> delayedString() async {
await Future.delayed(const Duration(seconds: 2));
return "result";
}
您将得到以下内容:
[2, result]
printed at the end
您可以在这里阅读更多相关信息: