在 Android Compose 导航中,导航参数填充在
SavedStateHandle
中,然后可以在 ViewModel
中访问。我已经在实践中做到了这一点,并且这里详细概述了实现:https://stackoverflow.com/a/69145748/12385518。
我的问题是我找不到任何关于为什么/如何发生这种情况的文档。事实上,我什至找不到官方文档,甚至根本没有提到导航参数位于
SavedStateHandle
中。我很想了解更多相关内容。我已阅读这些文档(以及更多文档),但在该主题上没有发现任何内容:
https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate https://developer.android.com/reference/androidx/lifecycle/SavedStateHandled
这似乎是一种非常好的传递导航参数的技术,但是由于没有在任何地方提到它,所以我正在考虑过渡到另一种技术。
以下是导航参数如何传递到
ViewModel
。
当您调用
NavController.navigate(route, args)
时,会创建 NavBackStackEntry
(source)。
NavBackStackEntry
创建一个 SavedStateViewModelFactory
,顾名思义,它是一个用 ViewModel
(source)创建
SavedStateHandle
的工厂。
NavBackStackEntry
实现 HasDefaultViewModelProviderFactory
并通过 defaultViewModelProviderFactory
属性 (source) 公开上一步中的工厂。
至关重要的是,
HasDefaultViewModelProviderFactory
还有另一个属性:defaultViewModelCreationExtras
。这包含构建 ViewModel
时使用的额外数据字段。导航参数存储在这里(source)。
当调用
viewModel
创建方法(例如hiltViewModel
)时,它将检查ViewModelStoreOwner
(在本例中为NavBackStackEntry
)是否实现了HasDefaultViewModelProviderFactory
。如果是,那么它将把这些额外的东西(导航参数)传递给视图模型工厂(source)。
视图模型工厂,在本例中为
SavedStateViewModelFactory
,然后创建SavedStateHandle
,用导航参数(额外的)填充它,并将其提供给新创建的ViewModel
,以便它可以访问它们(来源)。