Asynchronous 在Dart中,onDone事件何时适用于StreamSubscription?
如果我将Asynchronous 在Dart中,onDone事件何时适用于StreamSubscription?,asynchronous,dart,events,stream,Asynchronous,Dart,Events,Stream,如果我将sample\u stream\u 1()过程更改为以下内容,则不会触发onDone事件: [Running] dart "./future_stream_demo.dart" waiting... Data: 1 Data: 2 Data: 3 Data: 4 Data: 5 Data: 6 Data: 7 Data: 8 Data: 9 Data: 10 [Done] exited with code=0 in 11.164 seconds 输出为: void
sample\u stream\u 1()
过程更改为以下内容,则不会触发onDone事件:
[Running] dart "./future_stream_demo.dart"
waiting...
Data: 1
Data: 2
Data: 3
Data: 4
Data: 5
Data: 6
Data: 7
Data: 8
Data: 9
Data: 10
[Done] exited with code=0 in 11.164 seconds
输出为:
void sample_stream_1() {
final myGenerator = NumberCreator();
final myStream = myGenerator.stream;
myStream
.listen(
(data) => print('Data: $data'),
onError: (err) => print('Error!'),
cancelOnError: false,
onDone: () {
myGenerator.finish();
print('Done!');
},
);
}
class NumberCreator {
final _controller = StreamController<int>();
var _count = 1;
NumberCreator() {
Timer.periodic(Duration(seconds: 1), (t) {
this._controller.sink.add(this._count);
this._count++;
if (_count > 10) t.cancel();
});
}
Stream<int> get stream => this._controller.stream;
void finish() => this._controller.close();
}
main(List<String> args) {
sample_stream_1();
print('waiting...');
}
void sample_stream_1() {
final myGenerator = NumberCreator();
final myStream = myGenerator.stream;
myStream
.take(5)
.listen(
(data) => print('Data: $data'),
onError: (err) => print('Error!'),
cancelOnError: false,
onDone: () {
myGenerator.finish();
print('Done!');
},
);
}
[Running]dart.“/future\u stream\u demo.dart”
等待。。。
数据:1
数据:2
数据:3
数据:4
数据:5
完成!
未处理的异常:
错误状态:关闭后无法添加事件
#0\u StreamController.add(dart:async/stream\u controller.dart:623:24)
#1\u StreamSinkWrapper.add(dart:async/stream\u controller.dart:900:13)
#2新的数字发生器。(文件:./future\u stream\u demo.dart:275:29)
#3个计时器和运行计时器(dart:isolate patch/Timer\u impl.dart:397:19)
#4 _Timer._handleMessage(dart:隔离补丁/定时器_impl.dart:428:5)
#5 RawReceivePortImpl.handleMessage(dart:隔离补丁/隔离补丁。dart:168:12)
[完成]在6.298秒内退出,代码为255
onDone事件被触发,但也会引发异常
因此:
流
关闭时,调用onDone
回调。在您提供的第一个示例中,您从未关闭流
,因此从未调用回调。如果在计时器取消的同时调用关闭函数,它将按您预期的方式工作。
例如:定时周期(持续时间(秒:1),(t){
此._控制器.sink.add(此._计数);
这个._count++;
如果(计数>10){
t、 取消();
完成();
}
});
流中。五点以后
当元素完成时,您的onDone
方法被调用,关闭
来自NumberCreator
的流
,但计时器仍在滴答作响,并试图向关闭的流
添加事件。混淆可能是因为take
方法返回一个流,该流在发出规定数量的事件后关闭,在本例中为5
流
,所以在您认为应该调用它的时候,它永远不会被调用首先,谢谢你的回答,我有一个关于这个问题的问题,但是我不能在这里发布,所以请检查下一篇帖子(答案),或者我需要将它作为一个新问题发布?@БιιλιαμΑκρεα你的问题与你在这里提出的问题没有直接关系。它偏离了最初的要求。我建议你在这里接受答案,并在通过评论删除之前删除你的答案
[Running] dart "./future_stream_demo.dart"
waiting...
Data: 1
Data: 2
Data: 3
Data: 4
Data: 5
Done!
Unhandled exception:
Bad state: Cannot add event after closing
#0 _StreamController.add (dart:async/stream_controller.dart:623:24)
#1 _StreamSinkWrapper.add (dart:async/stream_controller.dart:900:13)
#2 new NumberCreator.<anonymous closure> (file:./future_stream_demo.dart:275:29)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
[Done] exited with code=255 in 6.298 seconds