Dart `asyncExpand` 未按预期工作

Zak*_*Zak 3 stream dart

我正在尝试创建以下流baz,其中包含一个“外部”流,其中该流的每个事件也有一个“内部”流。

\n\n

对于外部流中的每个事件 X,X 的内部流中的所有事件都应添加到baz

\n\n
class Foo {\n  final StreamController<int> bar = StreamController();\n\n  Foo() {\n    getsAnOuterStream.listen((event) {\n      bar.addStream(getsAnInnerStream(event));\n    });\n  }\n\n  Stream<int> get baz => bar.stream;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码按预期工作。然而,我知道我可以通过使用该asyncExpand 方法来简单地实现这一点。

\n\n
class Foo {\n  final Stream<int> baz = getsAnOuterStream\n    .asyncExpand((event) => getsAnInnerStream(event));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当外部流更改时,这不起作用 \xe2\x80\x93,新的内部流事件不会添加到baz. 我在这里缺少什么微妙之处吗?任何帮助深表感谢!

\n\n

只是要注意...我认为问题可能与此有关:如果内部流永远持续下去,则baz永远不会继续处理下一个内部流中的事件。但是,如果这是问题所在,为什么顶级解决方案有效?

\n

hit*_*rik 5

顶部代码工作而底部代码不工作的原因是StreamController.addStream()文档)和Stream.asyncExpand().

addStream监听流的事件getsAnInnerStream(event)并将它们转发到bar,而asyncExpand等待getsAnInnerStream(event)流结束然后再移动到下一个event

这意味着如果内部流长时间(或无限期)打开,您的代码将无法按预期工作。