返回后StateFlow/LiveData未更新问题求助
Hilt环境下返回Fragment后数据未更新的数据流问题
问题概述
- 两个Fragment(A、B)通过集中式
IntRepository共享数据,Repository使用MutableStateFlow传递数据,ViewModel将Flow转换为LiveData给Fragment渲染UI - 异常表现:从Fragment A跳转至Fragment B并修改数据后,通过返回键/手势回到Fragment A,A仍显示修改前的旧数据;但通过显式导航返回(如调用
popBackStack())则数据更新正常 - 排查结论:未使用Hilt时数据流完全正常,引入Hilt依赖注入库后出现该异常
核心原因
你的IntRepository未声明单例作用域,Hilt默认会为每个依赖请求创建新的实例。这导致ViewModelA和ViewModelB拿到的是两个完全独立的IntRepository对象:
- Fragment B修改的是自身ViewModel对应的Repository数据
- Fragment A的ViewModel仍监听着旧的Repository实例,自然无法收到数据更新通知
解决方案
给IntRepository添加@Singleton注解,确保Hilt全局只创建一个实例,实现数据真正共享:
import javax.inject.Singleton @Singleton // 添加单例作用域 class IntRepository @Inject constructor() { private val screenStateFlow = MutableStateFlow<Int?>(null) fun observeScreenState(): Flow<Int?> = screenStateFlow.asStateFlow() fun updateScreenState(value: Int) { screenStateFlow.value = value } }
额外验证点
- 确认你的Application类已添加
@HiltAndroidApp注解,这是Hilt正常工作的基础:
@HiltAndroidApp class MyApp : Application()
- 检查Fragment的
viewLifecycleOwner使用是否正确:你的代码中已经用viewLifecycleOwner观察LiveData,这是正确的,能保证UI销毁时自动取消订阅,避免内存泄漏
补充说明
未使用Hilt时,你应该是手动将IntRepository实现为了单例(比如用object类或双重校验锁),所以数据能正常共享;而引入Hilt后,依赖注入的规则改变,未指定作用域导致实例不唯一,才出现了这个问题。
内容的提问来源于stack exchange,提问作者Iván Garza Bermea
相关产品推荐
相关产品推荐

