底部栏中viewmodel的Jetpack Compose调用函数



我有一个底部栏,在这个可组合的函数中,我想调用一个函数,我已经在我的应用程序导航的导航图的ViewModel中设置,但不能想到任何方法来做到这一点?我尝试了一些界面,但是没有任何进展

@Composable
fun BottomNavBar(
currentRoute: String?,
navigateToBuild: () -> Unit,
navigateToSaved: () -> Unit
) {
Column() {
Row(modifier = Modifier
.fillMaxWidth()
.height(1.dp)
.background(Color.Gray)) {
}
BottomAppBar(
modifier = Modifier
.height(72.dp),
backgroundColor = Color.White
) {
navItems.forEach { item ->
val selected = currentRoute == item.route
BottomNavigationItem(
icon = {
Image(
painter = painterResource(
id = if (selected) item.selectedIcon else 
item.unselectedIcon),
contentDescription = item.title
)
},
selected = selected,
onClick = {
when (item.route) {
NavigationItem.Build.route -> {
navigateToBuild()
}
NavigationItem.Saved.route -> {
navigateToSaved()
// I want to call viewmodel function here
}
}
}
)
}
}
}
}

我的底部栏是脚手架的一部分,我的视图模型是在AppNavigation可组合的,所以他们都是完全分开的,我不能想到任何方式让他们沟通?

Scaffold(
bottomBar = {
BottomNavBar(
currentRoute = currentRoute,
navigateToBuild = { navController.navigate("build/0") },
navigateToSaved = { navController.navigate(DashboardScreens.Saved.route) })
}
) { innerPadding ->
Box(
modifier = Modifier
.padding(innerPadding)
.background(Color.White)
) {
AppNavigation(navHostController = navController)
}
}

在Compose中,视图模型的生命周期被绑定到Compose导航路由(如果有的话),否则绑定到Activity/Fragment,这取决于setContent是从哪里被调用的。

第一个viewModel()调用创建一个视图模型,从任何可组合函数对同一类的所有其他调用将返回相同的对象给您。所以只要你在同一个导航路线中,你可以安全地从BottomNavBar:

调用viewModel()
@Composable
fun BottomNavBar(
currentRoute: String?,
navigateToBuild: () -> Unit,
navigateToSaved: () -> Unit
) {
val viewModel = viewModel<ViewModelClass>()
}
@Composable
fun AppNavigation(navHostController: NavController) {
val viewModel = viewModel<ViewModelClass>()
}