为什么要使用不同的语法来初始化 ViewModel?

问题描述 投票:0回答:1

所以我一直在尝试学习Android,目前正在研究MVVM。所以我明白了,我们可以创建

ViewModels
作为
Views
Models
之间互动的桥梁。在 Android 中,我们可以通过扩展
ViewModel
类来创建
ViewModel
,因为这不会在配置更改时处置
ViewModel
。 似乎以下是创建
ViewModel
实例的错误方法,因为它将在每次重组时创建视图模型的新实例:

val myViewModel = MyViewModel()

我了解的其他有效方法是:

val mainViewModel by viewModels<MainViewModel>()
val mainViewModel = viewModel<MainViewModel>() // to use this, I had to add another dependency

Android 中默认使用第一个,为什么我们不只使用第一个呢?为什么我们通过添加另一个依赖项来使用第二个?他们不应该做同样的事情吗?
如果我没有意义,我真的很抱歉,前几天才开始学习。

android mvvm
1个回答
0
投票

viewModels() 和 viewModel() 之间的区别在于,对于 viewModel(),如果您需要在构造函数中提供 ViewModel 参数以便在 Compose 中创建,则可以为其提供 ViewModelProvider.Factory。

类似这样的事情

companion object {
    val Factory: ViewModelProvider.Factory = viewModelFactory {
        initializer {
            
            val myRepository = MyRepository()
            MyViewModel(myRepository= myRepository )
        }
    }
}

然后你就可以这样使用它

val myViewModel = viewModel<MyViewModel>(factory = MyViewModel.Factory)

第一种方法通常用于非组合应用程序,当您不需要工厂时

© www.soinside.com 2019 - 2024. All rights reserved.