flutter - 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 上,他们已经建议某人它应该可以工作,但在StreamedResponse 文档上仍然如此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);
推荐阅读
- json - 将 json 编辑为 csv 输出文件
- visual-studio-code - VS 代码扩展是否独立于操作系统?
- python-3.x - 如何在动态 Pandas DataFrame 中将秒数转换为自定义间隔格式?
- mongoose - Mongoose find() 所有 json 对象
- pandas - 无法解释的 Dask 内存使用情况
- aframe - 我正在制作一个带有 a-frame 的 web vr 游戏,但它冻结了
- javascript - 如何使用 Angular(非材质)制作切换深色主题
- sql - 错误:尝试在空表中首次加载表中的 Excel 数据时,Oracle Apex 中的“表名已存在”
- multilinestring - H.geo.LineString().X 未定义
- sql - 如何从 3 个不同的表中执行 INSERT INTO?