如何在Android ViewModel初始化时通过SavedStateHandle获取Deep-link参数
在ViewModel初始化时获取Deep-link数据的方案
方法一:通过SavedStateHandle传递解析后的参数
利用Hilt注入的SavedStateHandle作为载体,在Activity中解析Deep-link URI后将参数存入其中,ViewModel即可在初始化时读取。
步骤:
- 在Activity中解析Deep-link URI并提取参数
- 将参数存入ViewModel的
SavedStateHandle - ViewModel从
SavedStateHandle中读取参数并执行初始化逻辑
代码示例:
Activity代码
class ProfileActivity : AppCompatActivity() { private val viewModel: ProfileViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) intent.data?.let { uri -> // 提取URI中的id参数 val profileId = uri.getQueryParameter("id") profileId?.let { // 将参数存入SavedStateHandle viewModel.savedStateHandle.set("profile_id", it) } } // 后续页面初始化逻辑 } }
ViewModel代码
@HiltViewModel class ProfileViewModel constructor( val savedStateHandle: SavedStateHandle ) : ViewModel() { // 初始化时读取参数 private val profileId: String? = savedStateHandle.get<String>("profile_id") init { profileId?.let { id -> // 这里执行需要用到ID的初始化逻辑,比如请求用户数据 loadProfileData(id) } } private fun loadProfileData(id: String) { // 业务逻辑实现 } }
方法二:使用AssistedInject直接传递参数
通过Hilt的AssistedInject特性,在创建ViewModel时直接将解析后的Deep-link参数传入,避免依赖SavedStateHandle的间接传递,逻辑更直接。
步骤:
- 为ViewModel添加AssistedInject构造器和辅助Factory
- 在Activity中解析URI参数,通过自定义Factory创建ViewModel
- ViewModel在初始化时直接使用传入的参数
代码示例:
(注:需先在项目中配置Hilt Assisted相关依赖)
ViewModel代码
@HiltViewModel class ProfileViewModel @AssistedInject constructor( @Assisted private val profileId: String? ) : ViewModel() { init { profileId?.let { id -> // 初始化时直接使用参数 loadProfileData(id) } } private fun loadProfileData(id: String) { // 业务逻辑实现 } // 定义Assisted Factory @AssistedFactory interface Factory { fun create(profileId: String?): ProfileViewModel } companion object { // 提供ViewModelProvider.Factory供Activity使用 fun provideFactory( factory: Factory, profileId: String? ): ViewModelProvider.Factory = object : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun <T : ViewModel> create(modelClass: Class<T>): T { return factory.create(profileId) as T } } } }
Activity代码
class ProfileActivity : AppCompatActivity() { // 注入ViewModel的Assisted Factory @Inject lateinit var profileViewModelFactory: ProfileViewModel.Factory // 通过自定义Factory创建ViewModel,传入解析后的参数 private val viewModel: ProfileViewModel by viewModels { val profileId = intent.data?.getQueryParameter("id") ProfileViewModel.provideFactory(profileViewModelFactory, profileId) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 后续页面初始化逻辑 } }
补充:若使用Jetpack Navigation组件
若项目采用Navigation Component处理Deep-link,可通过Safe Args自动生成参数类,直接将参数传递给ViewModel:
- 在导航图中配置Deep-link并定义参数
- 通过Safe Args获取参数后,按方法二的方式传入ViewModel即可
内容的提问来源于stack exchange,提问作者sindrenm
相关产品推荐
相关产品推荐

