【问题标题】:What are differences creating viewmodels way?创建视图模型的方式有什么区别?
【发布时间】:2021-04-15 09:33:39
【问题描述】:
我已经在我的项目中使用 viewModel。但我知道我可以通过多种方式初始化视图模型。你知道这些方式有什么区别吗?
- viewModel = ViewModelProvider(this).get(ViewModelClass::class.java)
- viewModel = ViewModelClass()
- viewModel : ViewModelClass : by viewModels()
- viewModel : ViewModelClass by ViewModelse{
ViewModelFactory(this,Repository(),intent
}
有什么技术差异?
【问题讨论】:
标签:
android
android-studio
kotlin
mvvm
dependency-injection
【解决方案1】:
通过使用
-
viewModel = ViewModelProvider(this).get(ViewModelClass::class.java) 你正在创建一个ViewModelClass 的实例,其作用域是这个片段/活动,并且每当重新创建活动时相同视图模型的实例被分配而不是一个新的实例
-
viewModel = ViewModelClass() 虽然看起来是正确的,但事实并非如此。每当重新创建活动时,都会分配视图模型的 new 实例。 不要尝试通过直接调用其构造函数来创建 ViewModel 的实例,而是让ViewModelProvider 来完成这项工作。
-
viewModel: ViewModelClass by viewModels() 由Android KTX 提供delegate ViewModel 的创建。它类似于
val viewModel by lazy{
ViewModelProvider(this).get(MyViewModel::class.java)
}
-
viewModel : ViewModelClass by ViewModels{ ViewModelFactory(this,Reposityory(),intent)} 类似于
val viewModel by lazy {
ViewModelProvider(this, ViewModelFactory(this,Reposityory(),intent)).get(MyViewModel::class.java)
}