从 Android 视图模型注入的 SavedStateHandle 访问深层链接参数



我将如何在 Android 架构组件内部的深层链接ViewModel在其初始时间访问数据。我可以通过 Hilt 注入的SavedStateHandle访问意图Bundle(intent.extras) 中提供的附加功能,但是当通过深层链接打开活动时,我在活动级别上只有一个 URI(intent.data),而ViewModel中没有任何内容。

例如,假设我通过my-app://profile?id=123之类的内容打开我的活动,我将如何在初始化时从 AAC ViewModel 访问该 123 ID?

一种解决方案可能是拦截视图模型的创建。ComponentActivity.viewModels()扩展允许更改CreationExtras,这将传递给SavedStateHandle

public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline extrasProducer: (() -> CreationExtras)? = null,
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM>

默认情况下,ComponentActivity通过getDefaultViewModelCreationExtras()为其视图模型创建额外内容,这只会从意图中获取额外内容,但是传递extrasProducer,我们可以注入更多内容:

private val viewModel: SomeViewModel by viewModels(
extrasProducer = {
val extras = MutableCreationExtras(defaultViewModelCreationExtras)
intent?.data?.getQueryParameter("id")?.let { queryParamId ->
extras[DEFAULT_ARGS_KEY] = bundleOf("id" to queryParamId)
}
extras
}
)

最新更新