下载进度 dart:http
Downloading progress in dart:http
我正在尝试为下载文件制作一个进度条指示器,但是如果我向 StreamedResponse
添加一个侦听器,管道会工作,但不会完成它的未来。
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 they already advised someone that it was supposed to work, but on 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);
我正在尝试为下载文件制作一个进度条指示器,但是如果我向 StreamedResponse
添加一个侦听器,管道会工作,但不会完成它的未来。
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 they already advised someone that it was supposed to work, but on 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);