我是 Android 开发新手。目前,我正在使用 Jetpack Compose 构建 Android 应用程序。我也在学习 MVVM 架构。
对于这种架构,我不明白的一件事是为什么我们需要使用 ViewModelProvider.Factory
将 View 模型传递到屏幕。
例如,
取而代之的是
@Composable
fun HomeScreen() {
val factory = object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val repository = InMemoryPlantService()
@Suppress("UNCHECKED_CAST")
return HomeViewModel(
plantRepository = repository
) as T
}
}
val homeViewModel: HomeViewModel = viewModel(null, factory)
val currentState: State<HomeViewState> = homeViewModel.viewState.collectAsState()
HomeScreenScaffold(currentState.value)
}
我们不能这样做吗,
@Composable
fun HomeScreen() {
val repository = InMemoryPlantService()
val homeViewModel: HomeViewModel = HomeViewModel(
plantRepository = repository
)
val currentState: State<HomeViewState> = homeViewModel.viewState.collectAsState()
HomeScreenScaffold(currentState.value)
}
请帮忙。
完整的源代码可以在这里找到:https://github.com/adammc331/bloom
HomeScreen
可以在这里找到:https://github.com/AdamMc331/Bloom/blob/development/app/src/main/java/com/adammcneilly/bloom/HomeScreen.kt
最佳答案
当你打电话时:
val homeViewModel: HomeViewModel = viewModel(null, factory)
函数 viewModel(...)
将在您第一次请求 ViewModel 时创建一个新的 HomeViewModel
,否则它将返回 的前一个实例>HomeViewModel
如果它已经存在。这是使用 ViewModel 的优势之一,因为在配置更改(或重组)时,您的 ViewModel 应该被重用,而不是再次创建。它的工作方式是在必要时使用 ViewModelProvider.Factory
创建 ViewModel。您的 ViewModel 在其构造函数上有一个参数,如果您不提供自定义 ViewModelProvider.Factory
,默认的 Android 类将无法知道如何创建您的 ViewModel 并传递该参数(即存储库)。如果您的 ViewModel 没有任何参数,默认的 ViewModelProvider.Factory
使用反射通过无参数构造函数创建您的类。
如果你这样做:
val homeViewModel: HomeViewModel = HomeViewModel(
plantRepository = repository
)
您的 ViewModel 将被创建多次,并且不会在配置更改或重组中重复使用,因为您总是在那里创建它 - 而不是要求创建它或在它已经存在时重新使用它,这就是viewModel(...)
函数。
关于android - 为什么我们需要 ViewModelProvider.Factory 来将 View 模型传递给屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67985585/