这是不起作用的流(我自己的):
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=
他们都应该打印in
,in
,out
,但是我的人不会打印out
(因为它永远不会脱离{{1} }循环)。
答案 0 :(得分:1)
这可以按预期工作,但这仅是由于onCancel
和controller.close
之间的阴险互动。
当您调用controller.close
时,它将返回一个将来完成控制器完成的将来。当控制器已交付所有事件和/或已取消并且对onCancel
的调用已完成时,控制器就完成了。
在onCancel: () => controller.close()
返回的未来只有在同一未来完成后才完成的情况下,行controller.close()
会为您设置。因此,它永远不会完成。 onCancel
也返回了那个未来,因此显然在退出时调用cancel
的循环也从未完成。
我认为我们应该调查这是如何工作的。收到cancel
事件后,循环不应调用done
。
您还应该删除onCancel
参数。 cancelled
结束后,无需关闭控制器-没人会收到完成事件。