android - 为什么我们需要 ViewModelProvider.Factory 来将 View 模型传递给屏幕?

标签 android kotlin mvvm android-jetpack-compose

我是 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/

相关文章:

Kotlin 使用 GSON 将 json 数组转换为模型列表

c# - 在不同类中的Property上引发PropertyChangeNotification(不同的ViewModel)

c# - MVVM : Binding Command with Observable collection to Listbox and taking values from textbox

java - Android 位图图像内存不足

java - 从 Uri 类型 android 创建文件

java - 如果 Android API 级别低于 26,如何将存储访问框架与 MediaMuxer 一起使用

android - Kotlin 中的 SAM 转换(Lambda 表达式)

c# - MVVM Light 工具包示例

android - Logcat 和 toast 的 RxJava onNext 方法

android - 如何制作启动画面?