【原创】解决ShareFlow无法接收事件

在开发中遇到这样的情况,由于每次页面接收事件都需要如下:

 lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.STARTED) {
            flow.collect { state ->
                ......
            }
        }
    }

所以我封装了下

inline fun <reified T> FragmentActivity.collectFlow(flow: SharedFlow<T>, crossinline  next: (T) -> Unit) {
    lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.STARTED) {
            flow.collect { state ->
                next(state)
            }
        }
    }
}

但是在使用时候无法页面无法接收到事件。经过排查应该是封装后导致事件收集滞后于viewModel中事件的发送事件。导致无法收集到事件。

在这里也了解到了ShareFlow的一个特性:数据发送时如果没有活跃的订阅者,数据会丢失。
MutableSharedFlow中有个参数replay,该参数就是需要保留的数据条数。

最终解决:需要设置 replay > 0 才能保留历史值,新订阅者才能收到最近的 replay 条数据。

posted @ 2025-06-20 10:37  拜雨  阅读(68)  评论(0)    收藏  举报