我将如何在 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
}
)