android 同一活动中不同组合功能的不同视图模型

uqcuzwp8  于 2023-06-04  发布在  Android
关注(0)|答案(3)|浏览(120)

我在什么地方读到过栈溢出-
如果你正在创建一个新的应用程序,你可以完全跳过使用Fragments,而只使用可组合函数来表示你的屏幕。
但是当使用片段时,我们可以为不同的片段/屏幕使用不同的视图模型..我们能用可组合的功能实现同样的功能吗..比如单个活动,不同的屏幕使用不同的可组合功能,不同的可组合功能使用不同的视图模型?如果是,这种做法是否理想?

igetnqfo

igetnqfo1#

但是在使用片段时,我们可以为不同的片段/屏幕使用不同的视图模型。
在Compose中,您可以使用可组合函数来显示屏幕-不再需要使用片段。
我们可以用可组合的功能来实现同样的功能吗?比如单个活动,不同屏幕的不同可组合功能,以及不同可组合功能的不同视图模型?
如果需要,可以为不同的可组合函数使用不同的ViewModel。这是你可以做到这一点:

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"
}

确保在build.gradle(Module)文件中添加ViewModel依赖项:

// Compose ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07"

如果是,这种做法是否理想?
这取决于您的项目要求。如果你有不同的大屏幕,你需要存储许多不同的值,你不需要在不同的屏幕上共享它们,你可以为它们使用不同的ViewModel。
如果屏幕很小并且/或者您需要在它们之间共享值,那么共享一个ViewModel将是一种方式。

lsmepo6l

lsmepo6l2#

你能做到吗?是的。你应该这么做吗?这取决于您的使用情况,但根本不是问题。
您可以选择这样做,但在这种情况下,最好的选择是保持代码整洁(可读和可维护)。所以,如果你要为整个屏幕创建可组合对象,我认为为每个屏幕使用多个视图模型是可行的,因为大量数据将被填充到一个视图模型中。但是,您应该注意视图模型的维护。如果你在composable中初始化vm,它有可能被破坏(特别是如果你使用导航)。您必须在Activity本身中将其声明为顶级。在视图世界中,单个Activity中的多个视图模型可能并不常见,但这样做没有问题。因此,我的建议是选择适合您特定用例的内容。如果你唯一想问的是是否可以做到这一点,以及这样做是否有任何问题,那么你的答案是-是的,和没有(分别)。

ars1skjm

ars1skjm3#

我也遇到同样的问题。通过查看Google示例代码GameViewModel.kt,您似乎需要显式地清理数据。
视图模型有init块来清理数据

init {
    resetGame()
}

当游戏结束时,同样的函数resetGame()也会被调用。
或者,如果使用导航组件,则可以依赖popBackStackhttps://stackoverflow.com/a/70141402/691626

相关问题