【问题标题】:How do I nest Streams in Dart (map Streams to Stream events)?如何在 Dart 中嵌套 Streams(将 Streams 映射到 Stream 事件)?
【发布时间】:2023-03-14 03:31:01
【问题描述】:

类似于this Flutter question 我想嵌套 Streams。
在 Flutter 中,这可以通过嵌套 StreamBuilders 轻松实现,但是,我不想使用小部件。相反,我想单独解决 Dart 中的问题。 (这里的嵌套意味着一个流依赖于另一个流的值,这些值应该结合起来)

让我来说明问题:

Stream streamB(String a);

streamA: 'Hi' --- 'Hello' ---- 'Hey'

如您所见,我有一个streamA 持续发出事件,还有一个streamB 来自streamA 发出的事件。在streamC 中,我想了解streamB每个事件

常规流映射

如果我有valueB 而不是streamB,我可以简单地使用streamA.map((event) => valueB(event)),但是,Stream.map 只能处理同步值。
还有Stream.asyncMap,不过,它只适用于Futures。
然后,还有Stream.expand,但它仅适用于同步迭代。

【问题讨论】:

    标签: flutter dart dart-async


    【解决方案1】:

    Stream.asyncExpand

    其实有一个Stream.asyncExpand method

    streamC = streamA.asyncExpand((event) => streamB(event));
    

    但是,如果第一个事件的子流 (streamB) 已关闭,则结果流 (streamC) 只会移动到源流 (streamA) 中的下一个事件.在说 Cloud Firestore 的情况下,这永远不会起作用,因为子流不会关闭。

    Stream.concurrentAsyncExpand

    幸运的是,有stream_transform package

    streamC = streamA.concurrentAsyncExpand((event) => streamB(event));
    

    这个包提供了一个并发的async 扩展功能。这样,结果流就不会等待子流关闭。

    但是,这样做的缺点是,当接收到源流中的新事件时,之前的子流不会自动关闭。
    因此,这对 Cloud Firestore 也没有用处。

    Stream.switchMap

    同样来自stream_transform 包:

    streamC = streamA.sequentialAsyncExpand((event) => streamB(event));
    

    这解决了我上面提到的问题。

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 2021-10-12
      • 2022-12-07
      • 2018-12-22
      • 2021-12-21
      • 2018-12-16
      • 2019-12-17
      • 1970-01-01
      相关资源
      最近更新 更多