我正在尝试Dart / Flutter的Stream函数。
没有任何订阅者,有什么方法可以启动流生成器吗?当我订阅它时它可以工作,但是最后一个订阅者离开后,生成器立即停止。我希望它继续生成(在这种情况下,即使没有订阅者,_count也可以随着时间不断增加)。
我正在尝试模拟流中出现的异步数据(Future.delayed 3 sec只是使其速度变慢,因此使用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
属性。Afaik控制器始终接受一个值,但不需要该流的侦听器。无论如何,您都可以使用hasListener
进行确认。请记住,StreamControllers
在其生命周期内接受一个订阅者,并且如果您打算多次(重新)订阅,则需要breadcast
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) {
// canel sub after 20 seconds
sub.cancel();
}
if (i == 30) {
// resub after 30 seconds
sub = ctrl.stream.listen((value) => print(value));
}
}
ctrl.close();
}
void listener(int value) {
print(value);
}
还有其他类似目的的类,例如BehaviorSubject,PublishSUbject和ReplaySubject。