为什么我们需要 ViewModelProvider.Factory 将视图模型传递到屏幕?

San*_*jay 3 android mvvm kotlin android-jetpack-compose

我是 Android 开发新手。目前,我正在使用 Jetpack Compose 来构建 Android 应用程序。我也在学习MVVM架构。

对于这种架构,我不明白的一件事是为什么我们需要使用它ViewModelProvider.Factory来将视图模型传递到屏幕。

例如,

取而代之的是,

@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)
}
Run Code Online (Sandbox Code Playgroud)

我们不能这样做吗

@Composable
fun HomeScreen() {
    val repository = InMemoryPlantService()
    val homeViewModel: HomeViewModel = HomeViewModel(
        plantRepository = repository
    )

    val currentState: State<HomeViewState> = homeViewModel.viewState.collectAsState()

    HomeScreenScaffold(currentState.value)
}
Run Code Online (Sandbox Code Playgroud)

请帮忙。

完整的源代码可以在这里找到: https: //github.com/adammc331/bloom

HomeScreen可以在这里找到:https://github.com/AdamMc331/Bloom/blob/development/app/src/main/java/com/adammcneilly/bloom/HomeScreen.kt

cd1*_*cd1 10

你打电话时:

val homeViewModel: HomeViewModel = viewModel(null, factory)
Run Code Online (Sandbox Code Playgroud)

如果这是您第一次请求 ViewModel,该函数viewModel(...)将创建一个新的,或者如果它已经存在,它将返回前一个实例。这是使用 ViewModel 的优点之一,因为在配置更改(或重组)时,您的 ViewModel 应该被重用,而不是再次创建。它的工作方式是在必要时使用 a 创建 ViewModel。您的 ViewModel 在其构造函数上有一个参数,如果您不提供自定义的. 如果您的 ViewModel 没有任何参数,则默认使用反射通过无参数构造函数来创建您的类。HomeViewModelHomeViewModelViewModelProvider.FactoryViewModelProvider.FactoryViewModelProvider.Factory

如果你这样做:

val homeViewModel: HomeViewModel = HomeViewModel(
    plantRepository = repository
)
Run Code Online (Sandbox Code Playgroud)

您的 ViewModel 将被创建多次,并且不会在配置更改或重组中重用,因为您总是在那里创建它 - 而不是要求创建它或重用它(如果它已经存在),这就是该函数的作用viewModel(...)

  • @Axel 坏主意,伙计,这根本不是推荐的方式,当你的 Composable 被破坏时,viewModel 也会被破坏。这就是 viewModel 的全部思想。它在应用程序的生命周期中幸存下来,但这样,你就将它的生命限制在一个可能可怜的极小的数量内。 (2认同)