Dartlang wait more than one future Dartlang wait more than one future dart dart

Dartlang wait more than one future


You can use Future.wait to wait for a list of futures:

import 'dart:async';Future main() async {  var data = [];  var futures = <Future>[];  for (var d in data) {    futures.add(d.loadData());  }  await Future.wait(futures);}

DartPad example


Existing answer gives enough information, but I want to add a note/warning.As stated in the docs:

The value of the returned future will be a list of all the values that were produced in the order that the futures are provided by iterating futures.

So, that means that the example below will return 4 as the first element (index 0), and 2 as the second element (index 1).

import 'dart:async';Future main() async {  print('start');  List<int> li = await Future.wait<int>([    fetchLong(),  // longer (which gives 4) is first    fetchShort(), // shorter (which gives 2) is second  ]);  print('results: ${li[0]} ${li[1]}'); // results: 4 2}Future<int> fetchShort() {  return Future.delayed(Duration(seconds: 3), () {    print('Short!');    return 2;  });}Future<int> fetchLong() {  return Future.delayed(Duration(seconds: 5), () {    print('Long!');    return 4;  });}


If you want to wait for multiple futures of different types and also support null-safety then you can add a helper function similar to the following.

import 'package:tuple/tuple.dart';Future<Tuple2<T1, T2>> waitConcurrently<T1, T2>(    Future<T1> future1, Future<T2> future2) async {  late T1 result1;  late T2 result2;  await Future.wait([    future1.then((value) => result1 = value),    future2.then((value) => result2 = value)  ]);  return Future.value(Tuple2(result1, result2));}

In order for this to work you need tuples.At the moment Dart does not provide tuples natively, but there is a package from Google which does: https://pub.dev/packages/tuple