【问题标题】:Jetpack Compose call function from viewmodel in my bottom barJetpack Compose 从我底栏中的 viewmodel 调用函数
【发布时间】:2021-10-24 16:21:02
【问题描述】:

我有一个底部栏,在这个可组合的函数中,我想调用我在应用程序导航的导航图中的 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)
         }
      }

【问题讨论】:

  • 使用状态调用视图模型中的函数。将状态传递给AppNavigation
  • 我认为 Abhimanyu 指的是状态提升,这是声明式 UI 开发中的最佳实践。阅读here

标签: android android-jetpack-compose


【解决方案1】:

在 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>()
}

【讨论】:

  • 所以我的视图模型与我的底栏不在同一个导航路径中。我的底部栏与脚手架位于顶层,因为我的特定屏幕的视图模型位于 AppNavigation 内部的层次结构的更下方。如果我在底部栏函数中创建视图模型,它似乎无法访问我当前在视图模型中持有的任何状态
  • @alfietap 请参阅this answer 了解如何从导航路线访问父视图模型,以及this answer 了解如何在目的地之间共享生命模型范围
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2022-12-19
  • 2022-08-13
相关资源
最近更新 更多