如何在外部方法中向已有的Kotlin Flow发射新数据?
在任意方法中向Flow发射数据的尝试与说明
你目前遇到的情况是,只能在flow构建器的代码块内部调用emit()来发射数据,示例代码如下:
val data: Flow<Boolean> = flow { emit(newData) }
你希望实现的是像LiveData或RxJava那样,能在任意方法里主动触发数据发射,比如:
fun someMethod() { data.emit(newData) }
就像你之前用LiveData的实现方式:
val data: LiveData<Boolean> = MutableLiveData() fun someMethod() { data.postValue(newData) // 主线程中也可以直接用 data.value = newData }
或是RxJava2里通过onNext()事件来主动推送数据的逻辑。
不过你也明确提到了一个核心点——Flow并非为此场景设计。Flow的设计更偏向冷流模式,它的发射逻辑是在有收集者订阅之后才会启动,而且emit()方法被限制只能在Flow的上下文(也就是flow构建器的代码块)中调用,这是Flow的设计约束。
如果需要类似LiveData/RxJava那种可以主动触发数据推送的能力,你可以考虑尝试MutableSharedFlow或者MutableStateFlow(它们属于热流范畴),通过持有可变实例来调用emit()方法发射数据,比如:
private val _data = MutableSharedFlow<Boolean>() val data: SharedFlow<Boolean> = _data fun someMethod() { // 在任意方法中调用 _data.emit(newData) }
不过这和你最初想直接调用data.emit()的思路略有不同,因为需要区分可变的内部实例和对外暴露的只读实例。当然,如果你最终觉得Flow的模式不符合你的需求,切换回LiveData或者继续使用RxJava也是更直接的解决方案。
内容的提问来源于stack exchange,提问作者Norutan
相关产品推荐
相关产品推荐

