whenBatchDownloadsComplete method

Future<List<DownloadTask?>?> whenBatchDownloadsComplete(
  1. List<String> urls, {
  2. Duration timeout = const Duration(hours: 2),
})

Implementation

Future<List<DownloadTask?>?> whenBatchDownloadsComplete(List<String> urls,
    {Duration timeout = const Duration(hours: 2)}) async {
  var completer = Completer<List<DownloadTask?>?>();

  var completed = 0;
  var total = urls.length;

  for (var url in urls) {
    DownloadTask? task = getDownload(url);

    if (task != null) {
      if (task.status.value.isCompleted) {
        completed++;

        if (completed == total) {
          completer.complete(getBatchDownloads(urls));
        }
      }

      // ignore: prefer_typing_uninitialized_variables
      var listener;
      listener = () {
        if (task.status.value.isCompleted) {
          completed++;

          if (completed == total) {
            completer.complete(getBatchDownloads(urls));
            task.status.removeListener(listener);
          }
        }
      };

      task.status.addListener(listener);
    } else {
      total--;

      if (total == 0) {
        completer.complete(null);
      }
    }
  }

  return completer.future.timeout(timeout);
}