Future.wait(futures) returns one Future that completes with a list once every input future is ready. Each score here is an async function that returns immediately, so the whole example settles without timers or external events.

Program

Play the program to await three scores together and combine them.

future_wait.dart
Replay: real traced execution (multi-file project)
Future<int> score(String name) async {
  if (name == 'Ada') return 9;
  if (name == 'Lin') return 12;
  return 6;
}

Future<void> main() async {
  var futures = [score('Ada'), score('Lin'), score('Mia')];
  var results = await Future.wait(futures);
  var total = results.reduce((a, b) => a + b);
  print('$results sum=$total');
}
  1. futures ← 3 score futures

    7Future<void> main() async {8  var futures = [score('Ada'), score('Lin'), score('Mia')];9  var results = await Future.wait(futures);
    values this step3 score futuresfutures
  2. return ← 9

    1Future<int> score(String name) async {2  if (name == 'Ada') return 9;3  if (name == 'Lin') return 12;
    values this step9returnAdaname
  3. return ← 12

    2if (name == 'Ada') return 9;3if (name == 'Lin') return 12;4return 6;
    values this step12returnLinname
  4. return ← 6

    3  if (name == 'Lin') return 12;4  return 6;5}
    values this step6returnMianame
  5. results ← [9, 12, 6]

    8var futures = [score('Ada'), score('Lin'), score('Mia')];9var results = await Future.wait(futures);10var total = results.reduce((a, b) => a + b);
    values this step[9, 12, 6]results3 futures resolvedfutures
  6. total ← 27

    9var results = await Future.wait(futures);10var total = results.reduce((a, b) => a + b);11print('$results sum=$total');
    values this step27total[9, 12, 6]results
  7. print('$results sum=$total');

    10  var total = results.reduce((a, b) => a + b);11  print('$results sum=$total');12}
    output[9, 12, 6] sum=27
    values this step[9, 12, 6]results27total
Future.wait `Future.wait(futures)` produces one future that completes with a list of all results in order.
already-completed Each `async` `return` completes that function's future with a value, so no timers, files, or network are involved.
aggregate `results.reduce((a, b) => a + b)` collapses the list into one total once the futures have all settled.