我尝试使用 Kotlin Flow 作为某种消息容器,它应该将此消息传递给所有观察者(收集器)。我不想故意使用 LiveData,因为它需要了解生命周期。
不幸的是,我注意到,如果一个收集器从流中收集消息,其他人就无法收到它。
我可以用什么来实现“一个输入-多个输出”。
小智 6
您可以使用StateFlow或SharedFlow,它们是 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。
| 归档时间: |
|
| 查看次数: |
4839 次 |
| 最近记录: |