可以使用多个收集器收集的 Kotlin 流(或类似的东西)

Dom*_*nik 4 android kotlin

我尝试使用 Kotlin Flow 作为某种消息容器,它应该将此消息传递给所有观察者(收集器)。我不想故意使用 LiveData,因为它需要了解生命周期。

不幸的是,我注意到,如果一个收集器从流中收集消息,其他人就无法收到它。

我可以用什么来实现“一个输入-多个输出”。

小智 6

您可以使用StateFlowSharedFlow,它们是 Flow API,使流能够以最佳方式发出状态更新并向多个使用者发出值。

从文档中,可以在这里找到:

StateFlow:是一个状态持有者可观察流,它向其收集器发出当前和新的状态更新。当前状态值也可以通过其 value 属性读取。

SharedFlow:向所有从中收集值的消费者发出值的热流。SharedFlow 是 StateFlow 的高度可配置的泛化。

使用状态流和视图模型的简单示例:

class myViewModel() : ViewModel() {

  val messageStateFlow = MutableStateFlow("My inicial awesome message")

}
Run Code Online (Sandbox Code Playgroud)

您可以使用某个范围发出新值:

yourScope.launch {
    messageStateFlow.emit("My new awesome message")
}
Run Code Online (Sandbox Code Playgroud)

您可以使用某些范围收集值:

yourScope.launch {
    messageStateFlow.collect {
        // do something with your message
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:切勿直接从 launch 或 launchIn 扩展函数收集 UI 流来更新 UI。即使视图不可见,这些函数也会处理事件。您可以按照文档的建议使用repeatOnLifecycle。