getBatchDownloadProgress method

ValueNotifier<double> getBatchDownloadProgress(
  1. List<String> urls
)

Implementation

ValueNotifier<double> getBatchDownloadProgress(List<String> urls) {
  ValueNotifier<double> progress = ValueNotifier(0);
  var total = urls.length;

  if (total == 0) {
    return progress;
  }

  if (total == 1) {
    return getDownload(urls.first)?.progress ?? progress;
  }

  var progressMap = <String, double>{};

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

    if (task != null) {
      progressMap[url] = 0.0;

      if (task.status.value.isCompleted) {
        progressMap[url] = 1.0;
        progress.value = progressMap.values.sum / total;
      }

      // ignore: prefer_typing_uninitialized_variables
      var progressListener;
      progressListener = () {
        progressMap[url] = task.progress.value;
        progress.value = progressMap.values.sum / total;
      };

      task.progress.addListener(progressListener);

      // ignore: prefer_typing_uninitialized_variables
      var listener;
      listener = () {
        if (task.status.value.isCompleted) {
          progressMap[url] = 1.0;
          progress.value = progressMap.values.sum / total;
          task.status.removeListener(listener);
          task.progress.removeListener(progressListener);
        }
      };

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

  return progress;
}