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事件适用于前一事件而不适用于后一事件
  • 为什么在后一种情况下会出现异常
  • 实施一个事件的正确方法是什么
  • 关闭时,调用
    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