从LiveData迁移到Kotlin Flow的疑问:StateFlow与SharedFlow场景及替代可行性
关于StateFlow重复emit相同值不触发回调的假设
你的假设完全正确。StateFlow本质是带状态的SharedFlow,它会始终保留最新的一个值,并且只有当新emit的值与当前保留的旧值不相等时,才会通知下游的收集者。所以你重复调用emit(true)时,因为值没有发生变化,Fragment中的回调自然不会被触发。
SharedFlow重复发送相同值能触发响应的原因
没错,SharedFlow默认属于事件流(默认replay = 0),它不会保留发送过的事件(除非你设置了replay参数指定要保留的历史事件数量)。每次调用emit时,不管值是否和之前相同,都会直接将事件发送给当前活跃的收集者,所以长按事件每次发送true都能触发Fragment的响应,和你之前用LiveData的行为一致。
StateFlow与SharedFlow能否完全替代LiveData?
绝大多数场景下,StateFlow和SharedFlow完全可以替代LiveData,但需要注意几个细节:
- LiveData天生具备生命周期感知能力,而Flow需要配合
repeatOnLifecycle(或viewLifecycleOwner.lifecycle.repeatOnLifecycle)这类API,才能在页面处于非活跃状态时自动停止收集,避免内存泄漏。不过现在Jetpack的lifecycle-runtime-ktx库已经提供了非常便捷的扩展函数,使用成本很低。 - StateFlow必须有初始值,这和LiveData可以设置初始值的特性一致;而SharedFlow默认没有初始值,需要根据业务场景选择是否设置
replay或initialValue。 - LiveData的
observe方法会自动在页面销毁时移除观察者,Flow则需要通过协程的生命周期绑定来实现类似效果,只要正确使用相关扩展,体验上和LiveData没有差异。
内容的提问来源于stack exchange,提问作者Kratos
相关产品推荐
相关产品推荐

