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

使用Hilt从Bundle传递Intent参数至ViewModel时SavedStateHandle为空

问题解决:SavedStateHandle为空的原因及修复步骤

你当前的问题是没有在获取ViewModel时向SavedStateHandle传入初始参数,默认的by viewModels()会创建空的SavedStateHandle,以下是具体修复步骤:


1. 在Activity中传递参数到SavedStateHandle

修改ViewModel的获取代码,通过SavedStateViewModelFactory传入包含你要传递的三个参数的Bundle:

private val viewModel: UserViewModel by viewModels {
    SavedStateViewModelFactory(
        application = application,
        owner = this,
        defaultArgs = bundleOf(
            "param1" to "参数值1", // 替换为你的实际参数
            "param2" to 123,
            "param3" to true
        )
    )
}

如果参数是从Activity的Intent中传递的,也可以直接复用Intent的 extras:

private val viewModel: UserViewModel by viewModels {
    SavedStateViewModelFactory(application, this, intent.extras)
}

2. 在ViewModel中读取参数

在UserViewModel里通过SavedStateHandle的get方法获取传入的参数:

@HiltViewModel
internal class UserViewModel @Inject constructor(
    private val myRepo: MyRepo,
    private val savedStateHandle: SavedStateHandle,
) : ViewModel() {
    // 读取参数,可根据实际类型调整泛型
    private val param1 = savedStateHandle.get<String>("param1")
    private val param2 = savedStateHandle.get<Int>("param2")
    private val param3 = savedStateHandle.get<Boolean>("param3")
    
    // 后续业务逻辑使用这些参数
}

额外注意事项

  • 确保你的Activity已经添加@AndroidEntryPoint注解,否则Hilt无法注入MyRepo等依赖
  • 传递和读取参数时要保证类型一致,避免类型转换异常
  • SavedStateHandle会自动在配置变更(如屏幕旋转)时保留参数,无需额外处理状态保存

内容的提问来源于stack exchange,提问作者StuartDTO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:50:50