JetPack中应用程序UI状态的全局ViewModel组成

发布于 2025-01-20 21:12:30 字数 1501 浏览 2 评论 0原文

例如,我试图更改 appBar 的标题或 BottomNavBar 是否应显示在不同的可组合项中。由于我不想将该 viewModel 传递给每个可组合项,因此我创建了一个名为 AppViewModel 的 viewModel 并使用 Hilt 注入它来更改这些值,提到的 viewModel 如下所示:

@HiltViewModel
class AppViewModel @Inject constructor(): ViewModel() {
    var showBottomNavBar = mutableStateOf(true)
}

在我的主要活动

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val appViewModel = hiltViewModel<AppViewModel>()
            val showBottomNavbar by remember {appViewModel.showBottomNavBar}
            AppTheme {
                val navController = rememberNavController()
                Scaffold(
                    bottomBar = {
                        if (showBottomNavbar)
                            BottomNavigation1(navController = navController)
                    }
                ) {
                    Box(Modifier.padding(it)) {
                        NavigationGraph(navController = navController)
                    }
                }
            }
        }
    }
}

和我的目标可组合项之一中就像下面的一样如果我更改 showBottomNavbar 它不会改变任何内容。

@Composable
fun Product(
    navController: NavController,
    appViewModel: AppViewModel = hiltViewModel()
) {
    LaunchedEffect(Unit) {
        appViewModel.showBottomNavBar.value = false
    }
}

我做错了什么以及如何实现我想要的目标? 提前致谢。

I'm trying to for example change the title of the appBar or whether the bottomNavBar should be shown in different composables. Since I don't want to pass that viewModel to every composable, I've created a viewModel called AppViewModel and inject it with Hilt to change these values, The mentioned viewModel is like this:

@HiltViewModel
class AppViewModel @Inject constructor(): ViewModel() {
    var showBottomNavBar = mutableStateOf(true)
}

In my main activity

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val appViewModel = hiltViewModel<AppViewModel>()
            val showBottomNavbar by remember {appViewModel.showBottomNavBar}
            AppTheme {
                val navController = rememberNavController()
                Scaffold(
                    bottomBar = {
                        if (showBottomNavbar)
                            BottomNavigation1(navController = navController)
                    }
                ) {
                    Box(Modifier.padding(it)) {
                        NavigationGraph(navController = navController)
                    }
                }
            }
        }
    }
}

And in one of my destination composables like the one below If I change the showBottomNavbar it doesn't change anything.

@Composable
fun Product(
    navController: NavController,
    appViewModel: AppViewModel = hiltViewModel()
) {
    LaunchedEffect(Unit) {
        appViewModel.showBottomNavBar.value = false
    }
}

What am I doing wrong and how can I achieve the what I'm looking for?
Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文