【问题标题】:Stream listen() method onDone callback not being called未调用 Stream listen() 方法 onDone 回调
【发布时间】:2022-01-06 11:33:27
【问题描述】:

我无法触发流的 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();
}

预期输出:

Value emitted: 1
Task done

实际输出:

Value emitted: 1

【问题讨论】:

标签: flutter dart


【解决方案1】:

在您致电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
}

【讨论】:

  • 哇,我不敢相信它这么简单。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多