我正在尝试为下载文件制作进度条指示器,但是如果我向 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/