Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在dart中下载进度:http_Flutter_Dart_Dart Http - Fatal编程技术网

Flutter 在dart中下载进度:http

Flutter 在dart中下载进度:http,flutter,dart,dart-http,Flutter,Dart,Dart Http,我正在尝试为下载文件制作进度条指示器,但如果我向流响应添加侦听器,管道将正常工作,但无法完成其未来 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

我正在尝试为下载文件制作进度条指示器,但如果我向
流响应
添加侦听器,管道将正常工作,但无法完成其未来

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();
final client=newhttp.client();
http.streamdresponse response=wait client.send(http.Request(“GET”、Uri.parse(“someurl”));
收到的var=0;
var length=response.contentLength;
//如果我删除这个侦听器,下面的等待就会完成
var listen=response.stream.listen((列表字节){
接收+=字节数。长度;
打印(${(接收/长度)*100}%);
});
var sink=downloadFile.openWrite();
等待响应。水流。管道(水槽);
听。取消();
sink.close();

在上,他们已经建议某人它应该有效,但在上,这应该始终是一个单一的订阅流。。因此,添加一个侦听器来计算百分比似乎在某种程度上影响了管道。你知道如何让它工作吗?

@pskink comment让我看看这个解决方案,它适用于你正在使用的每种类型的
接收器

  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);

可能重复使用
response.stream、map
例如,并更新您收到的
计数器。对不起,这一天刚刚开始。昨天,我通过观察正在编写的文件的长度,可以让它正常工作,但使用map的@pskink解决方案更简单,即使您没有写入文件,也可以正常工作,我将这些解决方案作为答案。谢谢你,你能举个完整的例子吗?