You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回后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
    }
}

额外验证点

  1. 确认你的Application类已添加@HiltAndroidApp注解,这是Hilt正常工作的基础:
@HiltAndroidApp
class MyApp : Application()
  1. 检查Fragment的viewLifecycleOwner使用是否正确:你的代码中已经用viewLifecycleOwner观察LiveData,这是正确的,能保证UI销毁时自动取消订阅,避免内存泄漏

补充说明

未使用Hilt时,你应该是手动将IntRepository实现为了单例(比如用object类或双重校验锁),所以数据能正常共享;而引入Hilt后,依赖注入的规则改变,未指定作用域导致实例不唯一,才出现了这个问题。

内容的提问来源于stack exchange,提问作者Iván Garza Bermea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:59:55