SharedFlow 和 StateFlow 的主要区别

Mil*_*lad 50 android kotlin

SharedFlowStateFlow之间有什么区别?

以及如何在MVI架构中使用这些?使用简单的流程或这些作为状态和事件更好吗?

小智 67

Flow 是冷的!,意味着它仅在收集数据时才发出数据。另外Flow不能保存数据,可以把它看成是水在里面流动的管道,Flow中的数据只是流动,不存储(没有.value功能)。

与 Flow 不同,StateFlow 和 SharedFlow 是热流,这意味着即使没有收集器,它们也会发出数据。此外,如果有多个收集器,将为每个收集器运行一个新的流程,彼此完全独立。SharedFlow 和 StateFlow 是允许在多个收集器之间共享自身的流,因此对于所有同时收集器来说,只有一个流有效运行。如果你定义了一个访问数据库的SharedFlow,并且它被多个收集器收集,那么数据库访问只会运行一次,并且结果数据将共享给所有收集器。

SharedFlow 和 StateFlow 有什么区别?

状态流

Stateflow 通过构造函数获取初始值,并在有人开始收集时立即发出它。Stateflow 与 LiveData 几乎相同。当视图进入 STOPPED 状态时,LiveData 会自动取消注册使用者。当收集 StateFlow 时,这不会自动处理,如果您想在 STOPPED 状态取消注册使用者,可以使用 RepeatOnLifeCyCle 作用域。如果您想要当前状态,请使用 stateflow(.value)。

共享流

StateFlow 仅发出最后一个已知值,而 SharedFlow 可以配置要发出的先前值的数量。如果您想要发出和收集重复值,请使用共享流。

概括

总之,当您需要管理和与多个收集器共享单个状态时,请使用 StateFlow。相反,当您需要在收集器之间共享事件流而不保留任何状态时,请使用 SharedFlow。

  • 您的“差异”部分只是引用了该文档,而没有提及真正的差异。如果可以配置它们之间的差异,以便一个可以像另一个一样工作,那么为什么他们创建相同实现的两个不同类,而它们仅在配置很少的情况下有所不同?必须存在实现差异,您为了回答而忽略并回答了该差异。 (4认同)
  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)

Ten*_*r04 15

StateFlow 是 SharedFlow 的子类型,具有更多受限制的配置选项(使其设置更简单且性能更好),但它增加了一个value属性。

StateFlow 的value属性代表其当前值,可以从任何地方检查,包括协程外部。在 MutableStateFlow 中,您还可以通过设置此value属性从流中发出值,甚至可以从任何协程外部发出值。MutableSharedFlow 有一个tryEmit()可以从外部协程使用的函数,但调用时是否成功取决于当前状态和缓冲区配置。另一方面,设置MutableStateFlow.value 总是成功的。

单个当前值这一概念的存在意味着 SharedFlow 的某些可配置功能不可用,因为它们会破坏该概念。以下是一些限制:

  1. 必须replay为 1,因为只有 1 个当前值。
  2. 除了 1 个当前值之外,不能有任何缓冲区,因为只有 1 个值。一个当前值无法被删除,但旧值总是会被​​删除,并且如果收集器需要一段时间才能收集前一个值,则旧值永远不会被收集器看到。
  3. 如果您将其更改为功能不等价的值,它仅确定要更改的当前值。这就像distinctUntilChanged()在基础 SharedFlow 上强制执行操作符一样。
  4. StateFlow必须有一个初始值,因为它始终有一个当前值。Base SharedFlow 不需要初始值。

如果您的流逻辑必须监视某些内容或执行 IO,并且您希望在存在多个可能的收集器时避免重复这项耗时的工作,那么像 SharedFlow 和 StateFlow 这样的热流非常有用。在 Android 上,它可用于在屏幕旋转期间保留流,在此期间收集器可能会被销毁,并创建新的收集器来收集相同的流。


And*_*Dev 10

SharedFlow 和 StateFlow 之间的主要区别在于,StateFlow 通过构造函数获取默认值,并在有人开始收集时立即发出该值,而 SharedFlow 不获取任何值,并且默认情况下不发出任何内容。