gpt4 book ai didi

android - 为什么在每个 Compose Navigation 路由中创建一个新的 ViewModel?

转载 作者:行者123 更新时间:2023-12-04 23:41:34 26 4
gpt4 key购买 nike

我有一个 Activity 应用程序,仅使用 UI 的可组合项(一个 Activity ,没有 fragment )。我使用一个 View 模型将 ui 的数据保存在两个不同的屏幕(可组合)中。我在两个屏幕中创建 View 模型,如 state documentation 中所述。

@Composable
fun HelloScreen(helloViewModel: HelloViewModel = viewModel())
现在我注意到在第一个屏幕中加载或设置的数据在第二个屏幕中被重置。
我还注意到 init{}每次调用 viewModel()叫做。这真的是预期的行为吗?
根据方法 documentation它应该返回现有的 ViewModel 或创建一个新的。
我还看到 View 模型是不同的对象。所以 viewModel()总是创造一个新的。但为什么?
有什么想法我可能做错了吗?还是我误解了该方法的用法?

最佳答案

通常 View 模型在整个可组合范围内共享,init不应多次调用。
但是,如果您使用的是撰写导航,它会为每个目的地创建一个新的模型店主。如果您需要在目的地之间共享模型,您可以通过以下两种方式进行:

  • 通过将其直接传递给 viewModel称呼。在这种情况下,只有传递的 View 模型将绑定(bind)到父存储所有者,并且在内部创建的所有其他 View 模型将被绑定(bind)(并在路由从堆栈中删除时被销毁)到当前路由。
  • 通过证明 LocalViewModelStoreOwner 的值(value),因此内部的所有可组合项都将绑定(bind)到父 View 模型存储所有者,因此当从堆栈中删除路由时不会被释放。
  • 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>()
    }
    }
    }

    关于android - 为什么在每个 Compose Navigation 路由中创建一个新的 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69002018/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com