【发布时间】:2021-04-08 10:24:19
【问题描述】:
在我目前正在开发的 Flutter/Dart 应用程序中,需要从我的服务器下载大文件。但是,我需要做的不是将文件存储在本地存储中,而是解析其内容并一次性使用它。我认为实现这一点的最佳方法是实现我自己的StreamConsumer 并覆盖相关方法。这是我到目前为止所做的事情
import 'dart:io';
import 'dart:async';
class Accumulator extends StreamConsumer<List<int>>
{
String text = '';
@override
Future<void> addStream(Stream<List<int>> s) async
{
print('Adding');
//print(s.length);
return;
}
@override
Future<dynamic> close() async
{
print('closed');
return Future.value(text);
}
}
Future<String> fileFetch() async
{
String url = 'https://file.io/bse4moAYc7gW';
final HttpClientRequest request = await HttpClient().getUrl(Uri.parse(url));
final HttpClientResponse response = await request.close();
return await response.pipe(Accumulator());
}
Future<void> simpleFetch() async
{
String url = 'https://file.io/bse4moAYc7gW';
final HttpClientRequest request = await HttpClient().getUrl(Uri.parse(url));
final HttpClientResponse response = await request.close();
await response.pipe(File('sample.txt').openWrite());
print('Simple done!!');
}
void main() async
{
print('Starting');
await simpleFetch();
String text = await fileFetch();
print('Finished! $text');
}
当我在 VSCode 中运行时,这是我得到的输出
Starting
Simple done!! //the contents of the file at https://file.io/bse4moAYc7gW are duly saved in the file
sample.txt
Adding //clearly addStream is being called
Instance of 'Future<int>' //I had expected to see the length of the available data here
closed //close is clearly being called BUT
Finished! //back in main()
我对这里潜在问题的理解仍然相当有限。我的期望
- 原以为我会用
addStream来积累正在下载的内容,直到 - 没有更多要下载的内容,此时将调用
close并且程序将显示exited
为什么addStream 显示instance of... 而不是可用内容的长度?
尽管 VSCode 调试控制台确实显示 exited,但这种情况会在显示 closed 几秒钟后发生。我认为这可能是不得不打电话给super.close() 的问题,但不是这样。我在这里做错了什么?
【问题讨论】:
标签: file dart asynchronous download httpclient