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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:31:05