StreamController.close()不会引发完成事件

时间:2018-07-21 08:15:42

标签: stream dart

这是不起作用的流(我自己的):

import 'dart:async';

Stream<int> generateNumbers() {
  StreamController<int> controller;
  controller = StreamController(
      onListen: () {
        for (final number in [1, 2]) {
          controller.add(number);
        }
        controller.close();
      },
      onCancel: () => controller.close());
  return controller.stream;
}

void main() async {
  await for (final _ in generateNumbers()) {
    print('in');
  }
  print('out');
}

这是一个有效的流(取自here):https://privatebin.net/?dfbc5965db5c57b1#wru/1BPk4Zp7LbT/kkomgnx8ruchbxAROyn9vFbjZbc=

他们都应该打印ininout,但是我的人不会打印out(因为它永远不会脱离{{1} }循环)。

1 个答案:

答案 0 :(得分:1)

这可以按预期工作,但这仅是由于onCancelcontroller.close之间的阴险互动。

当您调用controller.close时,它将返回一个将来完成控制器完成的将来。当控制器已交付所有事件和/或已取消并且对onCancel的调用已完成时,控制器就完成了。

onCancel: () => controller.close()返回的未来只有在同一未来完成后才完成的情况下,行controller.close()会为您设置。因此,它永远不会完成。 onCancel也返回了那个未来,因此显然在退出时调用cancel的循环也从未完成。

我认为我们应该调查这是如何工作的。收到cancel事件后,循环不应调用done

您还应该删除onCancel参数。 cancelled结束后,无需关闭控制器-没人会收到完成事件。