@Alexandre Beaudet的answer是正确的,但并没有给出很多关于正在发生的事情的背景.
当您调用loadString
时,它实际上是一个异步方法调用.您可以看出来,因为它返回的是Future<value>
,而不仅仅是value
.这意味着它不会立即产生字符串结果,但会在将来的某个时候产生.
在DART中有两种主要的方法来处理异步性;第一种是使用async
和await
,第二种是直接使用期货.请看dart guide on Asynchronous Programming.
如果您直接使用future.then
,则可以从普通函数(即从initState等)执行.您只需指定回调,并在回调中指定如何处理结果.
void printDailyNewsDigest() {
final future = gatherNewsReports();
future.then((news) => print(news));
}
如果您想使用await
,如@alexandre所示,您需要将您正在使用的函数标记为async
,即:
Future<Void> printDailyNewsDigest() async {
String news = await gatherNewsReports();
print(news);
}
如果覆盖函数(即initState),还需要确保不更改返回值.这应该大部分时间都会被dart 2的打字捕捉到,但void->;Future似乎并非如此.
最后需要注意的是,如果您使用数据的结果来构建小部件,您可能会考虑使用FutureBuilder.