SavedStateHandle 如何提供导航参数?

问题描述 投票:0回答:1

在 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

这似乎是一种非常好的传递导航参数的技术,但是由于没有在任何地方提到它,所以我正在考虑过渡到另一种技术。

android android-jetpack-compose android-navigation
1个回答
0
投票

以下是导航参数如何传递到

ViewModel

  1. 当您调用

    NavController.navigate(route, args)
    时,会创建
    NavBackStackEntry
    source)。

  2. NavBackStackEntry
    创建一个
    SavedStateViewModelFactory
    ,顾名思义,它是一个用
    ViewModel
    source
    )创建 SavedStateHandle 的工厂。

  3. NavBackStackEntry
    实现
    HasDefaultViewModelProviderFactory
    并通过
    defaultViewModelProviderFactory
    属性 (source) 公开上一步中的工厂。

  4. 至关重要的是,

    HasDefaultViewModelProviderFactory
    还有另一个属性:
    defaultViewModelCreationExtras
    。这包含构建
    ViewModel
    时使用的额外数据字段。导航参数存储在这里(source)。

  5. 当调用

    viewModel
    创建方法(例如
    hiltViewModel
    )时,它将检查
    ViewModelStoreOwner
    (在本例中为
    NavBackStackEntry
    )是否实现了
    HasDefaultViewModelProviderFactory
    。如果是,那么它将把这些额外的东西(导航参数)传递给视图模型工厂(source)。

  6. 视图模型工厂,在本例中为

    SavedStateViewModelFactory
    ,然后创建
    SavedStateHandle
    ,用导航参数(额外的)填充它,并将其提供给新创建的
    ViewModel
    ,以便它可以访问它们(来源)。

© www.soinside.com 2019 - 2024. All rights reserved.