class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
DifferentViewModels()
}
}
}
@Composable
fun DifferentViewModels() {
Column {
FirstComposable()
SecondComposable()
}
}
@Composable
fun FirstComposable(firstViewModel: FirstViewModel = viewModel()) {
Text(firstViewModel.value)
}
@Composable
fun SecondComposable(secondViewModel: SecondViewModel = viewModel()) {
Text(secondViewModel.value)
}
class FirstViewModel() : ViewModel() {
val value = "Value from the first View Model"
}
class SecondViewModel() : ViewModel() {
val value = "Value from the second View Model"
}
3条答案
按热度按时间igetnqfo1#
但是在使用片段时,我们可以为不同的片段/屏幕使用不同的视图模型。
在Compose中,您可以使用可组合函数来显示屏幕-不再需要使用片段。
我们可以用可组合的功能来实现同样的功能吗?比如单个活动,不同屏幕的不同可组合功能,以及不同可组合功能的不同视图模型?
如果需要,可以为不同的可组合函数使用不同的ViewModel。这是你可以做到这一点:
确保在build.gradle(Module)文件中添加ViewModel依赖项:
如果是,这种做法是否理想?
这取决于您的项目要求。如果你有不同的大屏幕,你需要存储许多不同的值,你不需要在不同的屏幕上共享它们,你可以为它们使用不同的ViewModel。
如果屏幕很小并且/或者您需要在它们之间共享值,那么共享一个ViewModel将是一种方式。
lsmepo6l2#
你能做到吗?是的。你应该这么做吗?这取决于您的使用情况,但根本不是问题。
您可以选择这样做,但在这种情况下,最好的选择是保持代码整洁(可读和可维护)。所以,如果你要为整个屏幕创建可组合对象,我认为为每个屏幕使用多个视图模型是可行的,因为大量数据将被填充到一个视图模型中。但是,您应该注意视图模型的维护。如果你在composable中初始化vm,它有可能被破坏(特别是如果你使用导航)。您必须在Activity本身中将其声明为顶级。在视图世界中,单个Activity中的多个视图模型可能并不常见,但这样做没有问题。因此,我的建议是选择适合您特定用例的内容。如果你唯一想问的是是否可以做到这一点,以及这样做是否有任何问题,那么你的答案是-是的,和没有(分别)。
ars1skjm3#
我也遇到同样的问题。通过查看Google示例代码GameViewModel.kt,您似乎需要显式地清理数据。
视图模型有init块来清理数据
当游戏结束时,同样的函数
resetGame()
也会被调用。或者,如果使用导航组件,则可以依赖
popBackStack
、https://stackoverflow.com/a/70141402/691626