首页 文章

Dart中的Future / async / await

提问于
浏览
9

我有一个函数 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 回答

  • 7

    不,异步具有传染性,无法从异步返回同步执行 .

    async / await 只是 methodThatReturnsFuture().then(...) 的语法糖

    使用 async 标记方法只是为了允许您在其正文中使用 await . 如果没有 async ,您仍然需要返回 Future 来调用代码,以便仅在 loadAsset() 的结果可用后执行 .

  • 5

    您可以直接使用从异步调用返回的Future . 这看起来像这样:

    class HasAsync {
      HasAsync() {
        asyncFunction().then((val) {
          print(val);
        });
      }
    
      Future<int> asyncFunction() async {
         int val = await otherFunction();
         return val;
      }
    }
    

    你不能在非异步函数中使用await .

    正如你猜测这是在一个扑动的应用程序中 . 如果是这种情况,请查看docs for FutureBuilder - 它可能有助于您尝试做的事情 .

相关问题