Kotlin Flow无法实时更新,ViewModel收集不到新值求助
问题解决:Flow仅初始化触发一次,后续更新无响应
核心问题
你的RealtimeListenerImpl没有被正确设置为单例。尽管模块标注了@InstallIn(SingletonComponent::class),但提供实例的@Provides方法缺少@Singleton注解,导致每次依赖注入都会创建一个新的RealtimeListenerImpl实例:
- Firebase事件触发的是某个实例的
updateUserData方法 - ViewModel中注入的是另一个完全独立的实例,其内部的
StateFlow自然不会收到更新
修复方案
在RealtimeListenerModule的bindingFunction方法上添加@Singleton注解,确保整个应用生命周期内只有一个RealtimeListenerImpl实例:
@Module @InstallIn(SingletonComponent::class) object RealtimeListenerModule { @Provides @Singleton // 新增此注解 fun bindingFunction() : RealtimeListener{ return RealtimeListenerImpl() } }
额外验证点
- 确认Firebase回调中调用的
updateUserData方法,确实属于ViewModel注入的那个RealtimeListenerImpl实例(添加日志打印实例哈希值即可验证) - 确保
User类正确实现了equals和hashCode方法:StateFlow默认会比较新旧值,若对象内容相同但引用不同,且未正确实现相等性判断,会跳过发射 - ViewModel中的
collect操作在viewModelScope下执行,只要ViewModel存活,协程就会保持活跃,无需额外处理生命周期
内容的提问来源于stack exchange,提问作者Damor vipul
相关产品推荐
相关产品推荐

