![](/img/trans.png)
[英]How do I nest Streams in Dart (map Streams to Stream events)?
[英]How to invoke streams from within a stream in Dart
我想输出进度消息,同时下载文件并在我的 flutter 应用程序中填充我的数据库。
为此,我使用了一个 StreamBuilder 和一个在执行工作时产生状态消息更新的 Stream。
到目前为止一切顺利,但现在除了我的状态消息外,我还想显示一些有关下载进度的详细信息。 据我所知,我可以将下载进度包装在另一个流中,但现在我对如何从状态更新流中调用该流有些困惑。
代码现在看起来像这样:
Stream<String> _upsertResult(context) async* {
yield "Downloading Identifiers... (1/6)";
await IdentifierService.downloadIdentifiers();
yield "Upserting Identifiers... (2/6)";
await IdentifierService.upsertIdentifiers();
yield "Downloading Locations... (3/6)";
await LocationService.downloadLocations();
yield "Upserting Locations... (4/6)";
await LocationService.upsertLocations();
yield "Downloading Identifiables... (5/6)";
await IdentifiableService.downloadIdentifiables();
yield "Upserting Identifiables... (6/6)";
await IdentifiableService.upsertIdentifiables();
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => CurtainInformationScreen()),
);
});
}
现在downloadIdentifiers()
实现为 Future,但我可以将其重写为 Stream,以便能够产生下载进度状态更新。
我想我可以收听我创建的新流并在我的 _upsertResult 流中重新生成它,但我想知道这里是否有更优雅的解决方案来解决我的问题,例如等待流结束,但重新生成所有Stream 运行时的结果。
我遵循了pskink的建议,并这样做了:
yield "Downloading Identifiers... (1/6)";
yield* IdentifierService.downloadIdentifiers();
根据http://dart.goodev.org/articles/language/beyond-async#yield
yield*(发音为 yield-each)语句旨在解决这个问题。 yield* 后面的表达式必须表示另一个(子)序列。 yield* 所做的是将子序列的所有元素插入当前正在构造的序列中,就好像我们对每个元素都有一个单独的 yield。 我们可以使用 yield-each 重写我们的代码,如下所示:
然后我可以在downloadIdentifiers
yield
,并且值将被传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.