【发布时间】:2021-10-20 08:08:55
【问题描述】:
我想在许多可组合项之间共享一个视图模型。就像我们在 Activity 中的 Fragment 之间共享视图模型一样。
但是当我尝试这个时
setContent {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "home") {
navigation(startDestination = "username", route = "login") {
// FIXME: I get an error here
val viewModel: LoginViewModel = viewModel()
composable("username") { ... }
composable("password") { ... }
composable("registration") { ... }
}
}
}
我收到一个错误
@Composable 调用只能在 @Composable 函数的上下文中发生
需要
- 视图模型应仅在 NavGraph 范围内处于活动状态。
- 当我去不同的路线然后回来时,我应该初始化一个新的视图模型(这就是我在 NavGraph 中调用它的原因)
几乎相似的解决方案
-
Philip Dukhov回答问题How to share a viewmodel between two or more Jetpack composables inside a Compose NavGraph?
但在这种方法中,视图模型保持在启动它的活动范围内,因此永远不会被垃圾回收。
【问题讨论】:
-
Compose Navigation 基于 Jetpack Navigation,因此本文档中的所有内容都应适用于 Compose。答案是使用 Compose 代码
-
Navigation Compose 的替代解决方案是 Jetmagic。它对共享视图模型有很好的支持:github.com/JohannBlake/Jetmagic
-
@AndroidDev 这个多平台友好吗?否则为什么要使用非 jetpack 库进行 android 开发?我们还使用 Hilt,它是基于 android 构建的,并且具有用于 compose 的互操作和文档
-
@clmno 它是开源的,完全用 Kotlin 编写,所以它应该是多平台友好的。肯定比 Navigation Compose 更胜一筹,因为它甚至可以让您以类似于在旧视图系统下完成 xml 布局的方式创建响应式布局..
标签: android viewmodel android-jetpack-compose dagger-hilt