Stream Listen() 方法 onDone 回调未被调用

Dom*_*rga 3 dart flutter

我无法触发流的 onDone 回调。

我尝试取消流订阅并关闭流控制器,但它不起作用。

这是一个基本示例:

示例代码:

import 'dart:async';

void main() async {
  final streamController = StreamController<int>();

  final streamSubscription = streamController.stream.listen(
    (event) => print('Value emitted: $event'),
    onDone: () => print('Task done'),
  );

  streamController.add(1);

  await Future<void>.delayed(Duration.zero);
  await streamSubscription.cancel();
  await streamController.close();
}
Run Code Online (Sandbox Code Playgroud)

预期输出:

Value emitted: 1
Task done
Run Code Online (Sandbox Code Playgroud)

实际输出:

Value emitted: 1
Run Code Online (Sandbox Code Playgroud)

h8m*_*oss 5

streamController.close()在您致电之前streamSubscription.cancel(),取消订阅意味着您将不会再收到有关该订阅的任何更多事件,包括onDone,这就是您没有获得最终事件的原因。streamSubscription.cancel()关闭流后将其删除或移动即可。

import 'dart:async';

void main() async {
  final streamController = StreamController<int>();

  final streamSubscription = streamController.stream.listen(
    (event) => print('Value emitted: $event'),
    onDone: () => print('Task done'),
  );

  streamController.add(1);

  await Future<void>.delayed(Duration(seconds: 1));
  // await streamSubscription.cancel() // comment this out.
  await streamController.close();
  await streamSubscription.cancel(); // <- here it is fine
}
Run Code Online (Sandbox Code Playgroud)