使用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
相关产品推荐
相关产品推荐

