【问题标题】:Why a new ViewModel is created in each Compose Navigation route?为什么在每个 Compose Navigation 路由中创建一个新的 ViewModel?
【发布时间】:2021-08-31 16:08:04
【问题描述】:

我有一个单一的活动应用程序,只使用 UI 的可组合项(一个活动,没有片段)。我使用一个视图模型将 ui 的数据保存在两个不同的屏幕(可组合)中。如state documentation

中所述,我在两个屏幕中都创建了视图模型
@Composable
fun HelloScreen(helloViewModel: HelloViewModel = viewModel()) 

现在我注意到在第一个屏幕中加载或设置的数据在第二个屏幕中被重置。

我还注意到每次调用viewModel() 时都会调用init{}。这真的是预期的行为吗?

根据方法的documentation,它应该返回现有的 ViewModel 或创建一个新的。

我还看到视图模型是不同的对象。所以viewModel() 总是创建一个新的。但为什么呢?

有什么想法我可能做错了吗?还是我误解了方法的用法?

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    通常视图模型为整个可组合范围共享,并且不应多次调用init

    但是,如果您使用的是撰写导航,它会为每个目的地创建一个新的模型店主。如果您需要在目的地之间共享模型,您可以通过以下两种方式进行:

    1. 直接传递给viewModel调用
    2. 通过证明 LocalViewModelStoreOwner 的价值,因此内部的所有可组合项都可以访问同一视图模型商店所有者。
    val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
        "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
    }
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = "first") {
        composable("first") {
            val model = viewModel<Model>(viewModelStoreOwner = viewModelStoreOwner)
        }
        composable("second") {
            CompositionLocalProvider(
                LocalViewModelStoreOwner provides viewModelStoreOwner
            ) {
                val model = viewModel<Model>()
            }
        }
    }
    

    【讨论】:

    • 嗨菲利普!谢谢你。我确实使用导航,所以这听起来很有希望。到目前为止,我认为我不必考虑这一点,因为我只有一项活动。我会试试看! :)
    • Hej Philip 感谢您向我介绍 CompositionLocal!我使用了第二种方法,我遇到了一些困难,但现在可以了!如果其他人偶然发现了这一点,这对我有帮助:developer.android.com/reference/kotlin/androidx/compose/runtime/…developer.android.com/jetpack/compose/compositionlocal
    • 是否有任何理由不对导航图中的每个可组合项使用它?对我来说,很明显我们希望每条路线都使用相同的 ViewModelStoreOwner...?
    • @jpm 这可能是关于拆分独立的屏幕范围,不确定。我建议您在撰写问题跟踪器上creating an issue 建议禁用此行为的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多