如何使用viewModel和组合导航正确在一起?



在使用Di的情况下,Android官方网站的编写方式如下

// import androidx.hilt.navigation.compose.hiltViewModel
@Composable
fun MyApp() {
NavHost(navController, startDestination = startRoute) {
composable("example") { backStackEntry ->
// Creates a ViewModel from the current BackStackEntry
// Available in the androidx.hilt:hilt-navigation-compose artifact
val exampleViewModel = hiltViewModel<ExampleViewModel>()
ExampleScreen(exampleViewModel)
}
/* ... */
}
}

如果在ExampleScreen中有很多其他的@Composable函数,就像这样

ExampleScreen() {
A()
B()
}
A() {
TopBar()
BottomBar()
....
}
B() ...

如果A()和它的子函数都需要使用vm中的东西,你不需要逐个传递vm的参数吗?因为如果vm是在这些函数中创建的,它就不是一个单例(因为导航组合会影响viewModel,所以每次切换页面时,这些viewModel都会被重新创建为一个新的)。正当我困惑的时候,我又在官方网站上看到了这个设计思路:

传递显式参数

一般的想法是我应该在父函数中传递子函数的逻辑代码,例如在ExampleScreen中写:
ExampleScreen() {
val vm = hilt<VM>()
A(onClick = vm.onClick, ...)
B(...)
}

所以我的问题是,如果我有很多嵌套函数,我不需要在每个函数中写一个逻辑参数吗?所以如果我想在每个函数中直接创建一个vm,但它不是单例的,我该怎么做?我困惑

您通过在顶层注入视图模型做了正确的事情。现在由你来决定如何将它传承下去。它们最终只是函数。你可以在任何地方传递视图模型,只传递特定的成员,或者什么都不传递。

做有意义的事,如果不行就迭代。

最新更新