【发布时间】:2020-12-26 06:19:38
【问题描述】:
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...');
}
输出是:
[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
onDone 事件未触发,如果我将sample_stream_1() 程序更改为:
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_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
onDone 事件被触发,但它也会引发异常。
所以:
- 为什么 onDone 事件对前一个有效,而对后一个无效?
- 为什么我在后一个中会出现异常?
- 实现 onDone 事件的正确方法是什么?
【问题讨论】:
标签: asynchronous dart events stream