dart - Dart/Flutter 流生成器在没有订阅者时停止
问题描述
我正在尝试 Dart/Flutter 的 Stream 功能。
有没有办法在没有任何订阅者的情况下启动流生成器?当我订阅它时它可以工作,但生成器在最后一个订阅者离开后立即停止。我希望它继续生成(在这种情况下,即使没有订阅者,_count 也可以随着时间的推移不断增加)。
我试图模仿出现在流中的异步数据(Future.delayed 3 秒只是减慢它的速度),因此使用 Stream.periodic 并不能完全减少它。
void main() {
Stream<int> generateStream() async*{
int _count = 0;
while (true) {
await Future.delayed(Duration(seconds: 3));
print(_count);
yield _count++;
}
}
generateStream();
}
提前感谢您的任何帮助。
麦克风
解决方案
您可以使用StreamController将结果发布到其stream
属性。
broadcast
请记住,普通 Streams 在其生命周期中只接受一个订阅者,如果您计划(重新)订阅多次,则需要StreamControllers。
这是一个例子:
import 'dart:async';
void main() async {
StreamController<int> ctrl = StreamController<int>.broadcast();
Stream<int> stream = ctrl.stream;
// a handle to manage the current subscription
StreamSubscription<int> sub;
for (int i = 0; i < 60; i++) {
// wait for 0.2s
await Future.delayed(Duration(milliseconds: 200));
// add a value to the controller
ctrl.add(i);
if (i == 10) {
// add listener
sub = stream.listen(listener);
}
else if (i == 20) {
// cancel sub after 4 seconds
sub.cancel();
}
if (i == 30) {
// resub after 6 seconds
sub = stream.listen(listener);
}
}
ctrl.close();
}
void listener(int value) {
print(value);
}
还有其他类似目的的类,例如BehaviorSubject、PublishSUbject和ReplaySubject。
推荐阅读
- actionscript-3 - Flash AS3 - 将多个对象拖放到多个目标
- c# - 如何正确地将我的 ContextMenu 命令绑定到 RelayCommand?
- javascript - 在 Jest 中使用 toBeCalledWith() 测试参数
- autohotkey - 使用自动热键激活组中最近活动的窗口
- python - __call__ 或 __init__ 在这里调用?不要不明白哪个和为什么
- amazon-web-services - s3 存储桶策略,例如从两个不同的帐户读取
- html - 每次我尝试触发更改事件时在 ie11 中接收脚本 70 错误
- python - python3元类的调用顺序
- python - 通过在每个索引处随机选取元素来合并 N 个列表
- excel - Excel 条件格式公式和范围 (VBA)