如何在Dart中正确等待多个异步方法?

3

最近我开始学习Flutter开发。在启动应用程序时,我首先想从不同的来源加载数据。但我遇到了一些问题,似乎我还没有完全理解异步/等待。

我的目标

当我启动应用程序时,我希望能从多个来源加载数据。这应该是并行完成的,但只有在所有数据源都完全加载完毕后才应继续进行。

我的尝试

import 'package:flutter/material.dart';

class AsyncTester extends StatefulWidget {
  @override
  _AsyncTesterState createState() => _AsyncTesterState();
}

class _AsyncTesterState extends State<AsyncTester> {
  @override
  void initState() {
    super.initState();
    startApplication();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }

  void startApplication() async {
    await loadData();
    print("starting Application!");
  }

  loadData() {
    loadDataSource1();
    loadDataSource2();
  }

  void loadDataSource1() async {
    await Future.delayed(Duration(seconds: 3));
    print("Data Source 1 loaded.");
  }

  void loadDataSource2() async {
    await Future.delayed(Duration(seconds: 2));
    print("Data Source 2 loaded.");
  }
}

输出结果如下:

I/flutter (23100): 开始应用!
I/flutter (23100): 数据源2已加载。
I/flutter (23100): 数据源1已加载。

我不明白为什么startApplication()没有等待loadData()完成。 我认为这正是await的作用?顺便说一句,我将loadDataSource1()和loadDataSource2()嵌套在loadData()中,因为这样做...
void startApplication() async {
   await loadDataSource1();
   await loadDataSource2();
   print("starting Application!");
}

是否有更好的方法来按顺序加载数据?


loadData() 函数中,您需要 await 其他调用,以便暂停程序执行,直到返回带值的 Future。 - Jorge Luis
1个回答

10

您应该使用Future.wait方法,该方法将并行执行您的两个异步操作,并在它们全部完成后完成:

void startApplication() async {
  await Future.wait([
    loadDataSource1(),
    loadDataSource2(),
  ]);
  print("starting Application!");
}

2
小问题:Future.wait 同时等待多个异步操作。它们是否并行执行取决于这些异步操作的实现。 - jamesdlin
在上面的示例中,“True”将是并行的,但正如你所说,这取决于操作。 - Guillaume Roux
谢谢!能否解释一下为什么我的实现不起作用?在我看来,await load Data() 应该在执行 print 语句之前完成。 - TheKnax
你需要将你的方法loadData变成异步的,并在其中加入一个await。 - Guillaume Roux
那么 await someMethod() 只等待 someMethod() 中的其他 await 语句? - TheKnax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接