我有一个loadData从文件加载一些文本的功能:
loadData
Future<String> loadAsset() async { return await rootBundle.loadString('assets/data/entities.json'); }
该loadString方法来自Flutter SDK,并且是异步的。
loadString
在loadAsset随后的方法被调用的另一种方法,那肯定我作为标记async,因为loadAsset是异步,我需要使用await:
loadAsset
async
await
Future<List<Entity>> loadEntities() async { String jsonData = await loadAsset(); return parseData(jsonData); }
该parseData方法不是异步的,它接收String,解析它并返回对象列表:
parseData
String
List<Entity> parseData(String jsonString) { ... }
但是由于loadEntities必须标记为async,所以要求它返回a Future,但是实际上,这不是Future因为我使用await,所以它等待loadAsset方法完成,然后parseData使用结果调用函数。
loadEntities
Future
这很容易变成async调用滚雪球,因为使用的每个方法也都loadEntities必须标记为async。
另外,我不能loadEntities在类构造函数中使用,因为构造函数应标记为async,这在Dart中是不允许的。
我async/await在Dart中使用模式错误吗?如何loadEntities在类构造函数中使用该方法?
async/await
不,异步具有传染性,没有办法从异步返回到同步执行。
async/ await仅用于methodThatReturnsFuture().then(...)
methodThatReturnsFuture().then(...)
用标记方法async仅允许您await在其内部使用。否则,async您仍然需要返回一个Future用于调用的代码,仅在结果loadAsset()可用后才能执行。
loadAsset()