flutter - dart :http 中的下载进度

标签 flutter dart dart-http

我正在尝试为下载文件制作进度条指示器,但是如果我向 StreamedResponse 添加一个监听器,管道工作,但不会完成它的 future 。

final client = new http.Client();
http.StreamedResponse response = await client.send(http.Request("GET", Uri.parse('someurl')));

var received = 0;
var length = response.contentLength;

//if I remove this listener, the await below gets completed
var listen = response.stream.listen((List<int> bytes) {
  received += bytes.length;
  print("${(received / length) * 100} %");
});

var sink = downloadFile.openWrite();
await response.stream.pipe(sink);
listen.cancel();
sink.close();

github他们已经建议某人它应该起作用,但是在 StreamedResponse docs保持不变 This should always be a single-subscription stream. .所以,添加一个监听器来计算百分比似乎是错误 StreamedResponse以某种方式管道。关于如何让它发挥作用的任何想法?

最佳答案

@pskink 评论让我找到了适用于所有 sink 类型的解决方案您正在使用。

  var length = response.contentLength;
  var received = 0;
  var sink = downloadFile.openWrite();

  await response.stream.map((s) {
    received += s.length;
    print("${(received / length) * 100} %");
    return s;
  }).pipe(sink);

完成此操作的另一种方法,如果您正在写入文件,则是观察文件长度
  var length = response.contentLength;
  var sink = downloadFile.openWrite();

  Future.doWhile(() async {
    var received = await downloadFile.length();

    print("${(received / length) * 100} %");
    return received != length;
  });

  await response.stream.pipe(sink);

关于flutter - dart :http 中的下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56638826/

相关文章:

flutter - 如何在带有Firebase的Flutter中使用电话号码进行身份验证?

flutter - 我们可以在抖动中创建Wifi热点吗?

flutter - 控制和禁用 flutter 中的下拉按钮?

flutter - 未找到 Dart 扩展功能

flutter - Flutter 中是否可以使用 body 发出 GET 请求?

flutter - 格式化datePicker标题-Flutter

flutter - 如何从Flutter中的Text Widget检索文本数据

flutter - 我可以在 Dart 中传递枚举类型作为参数吗?

Flutter:Http 发布请求错误无效的媒体类型:预期

flutter - 使用 http 包在 Flutter 上执行 POST 请求