我有一个函数 loadData
从文件中加载一些文本:
Future<String> loadAsset() async {
return await rootBundle.loadString('assets/data/entities.json');
}
loadString
方法来自Flutter SDK,并且是异步的 .
然后在另一个方法中调用 loadAsset
方法,我必须将其标记为 async
,因为 loadAsset
是异步的,我需要使用 await
:
Future<List<Entity>> loadEntities() async {
String jsonData = await loadAsset();
return parseData(jsonData);
}
parseData
方法不是异步的,它接收 String
,解析它,并返回一个对象列表:
List<Entity> parseData(String jsonString) {
...
}
但由于 loadEntities
必须用 async
标记,这要求它返回 Future
,但实际上它不是 Future
因为我使用 await
,它等待 loadAsset
方法完成,然后使用结果调用 parseData
函数 .
这很容易变成 async
调用的雪球,因为每个使用 loadEntities
的方法也必须标记为 async
.
另外,我不能在类构造函数中使用 loadEntities
,因为构造函数应该标记为 async
,这在Dart中是不允许的 .
我在Dart中使用 async/await
模式错了吗?我怎么能在类构造函数中使用 loadEntities
方法?
2 回答
不,异步具有传染性,无法从异步返回同步执行 .
async
/await
只是methodThatReturnsFuture().then(...)
的语法糖使用
async
标记方法只是为了允许您在其正文中使用await
. 如果没有async
,您仍然需要返回Future
来调用代码,以便仅在loadAsset()
的结果可用后执行 .您可以直接使用从异步调用返回的Future . 这看起来像这样:
你不能在非异步函数中使用await .
正如你猜测这是在一个扑动的应用程序中 . 如果是这种情况,请查看docs for FutureBuilder - 它可能有助于您尝试做的事情 .