StreamController 和 BehaviorSubject 是 Dart 中的流吗?

sgo*_*n00 6 dart flutter

我使用 StreamBuilder、StreamController、BehaviorSubject、Stream 等已经有一段时间了。但我仍然对一些定义感到困惑。特别是这个问题,StreamController 和 BehaviorSubject 是 Dart 中的一个流吗?

我之所以有这个问题,是因为我可以在网上找到以下单词/引用:

  • BehaviorSubject 是一个特殊的 StreamController...(来自API 文档
  • Observable 是一个扩展 Stream 的包装类。(Observable 是一个流)
  • BehaviorSubject 扩展Subject (BehaviorSubject 是一个Subject)
  • Subject 扩展了 Observable (Subject 是一个 Observable)

从在线文档的上述 4 点来看,它给了我:BehaviorSubject 是一个 Observable,然后是一个 Stream。所以 BehaviorSubject 是一个流。BehaviorSubject 也是一个 StreamController。因此 StreamController 是一个流。

但是如果 StreamController 是一个 Stream,这将与其他一些文章相矛盾,即 Stream 实际上是 StreamController 的一部分,并且您从 StreamController.stream 获取 Stream。

如果说到 Sink,就会更加混乱。

StreamController 实现了 StreamSink。所以 Sink 是一个特殊的 StreamController。

因此,从以上所有单词中,我得出以下结果:

BehaviorSubject = StreamController = Observable = Stream = Sink

最后,一切都是一样的……我疯了吗?

编辑:(我现在明白了。希望它是正确的)

为了澄清我的困惑,我想我必须理解"BehaviorSubject is a special StreamController"这句话。

通过谷歌搜索和检查一些 sdk 代码,我想我明白 BehaviorSubject 是一个特殊的 StreamController,但反之亦然。这将解决我的困惑。BehaviorSubject 扩展了Subject,Subject 实现了StreamController。因此"BehaviorSubject is a special StreamController"是正确的。但我不能说 StreamController 是一个 BehaviorSubject。因此,即使 BehaviorSubject 实际上是一个流,我也不能说 StreamController 是一个流。

我希望我上面的理解是正确的。

cre*_*not 6

AStreamController是一个StreamController
它不会扩展任何东西。所以它不是Observable, Stream,BehaviorSubject或 中的任何一个Sink

它确实如您所说的那样实现 Sink,因此允许您直接在其上添加数据,即使用streamController.add以及streamController.sink.add. 然后将此数据传递到Stream每个控制器携带的 。

BehaviorSubject实际上并不是标准库的一部分,只是对来自rxdart. 它允许您随时直接访问最新值。


小智 4

一点也不疯狂,流就像一个管道,将数据作为接收器接收并将其作为流返回,而 StreamController 只是用来控制流。我希望这是有帮助的