这个
.then()
正在被执行,但是
之后
身体的其他部分。正如你所说
loadString()
返回一个未来,因此在未来完成。等待未来完成使用
await
. (请注意,当您将函数标记为Async时,函数现在必须返回一个未来本身-因为它必须等待LoadString在将来完成,所以它本身必须在将来完成…)当您调用
l('something')
你必须等待结果。
Future<String> l(String name) async {
try {
String contents = await rootBundle.loadString('i10n/de.yaml');
return contents == null ? '@null@' : loadYaml(contents);
} catch (e) {
return 'oops $e';
}
}
你的很多实用功能都变成了
async
由于必须等待一些事情(有很多等待-等待文件读取、HTTP请求完成等)。你最终会以某种方式(从
initState
)
refresh(String s) {
l(s).then((r) {
setState(() {
i18nStuff = r;
});
});
}
当i18nstuff准备就绪时,设置小部件的状态,而构建中包含此内容的小部件将在虚拟UI之间切换几毫秒,直到它准备就绪,然后再切换到实际UI。
Widget build() {
if (i18nStuff == null) {
return new Container();
}
return new Column(
// build the real UI here
);
}