在我当前的项目中,我使用下一行:
mViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
例如,ViewModel
但在 https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders.html#ViewModelProviders() 中建议使用 ViewModelProvider.AndroidViewModelFactory
ViewModelProviders()
因为 API 级别 1.1.0 中已弃用。
为此目的有什么想法吗?
如果你有一个简单的视图模型扩展AndroidViewModel,没有任何额外的构造函数参数,它如下
- 扩展AndroidViewModel,无需任何额外的构造函数 参数
class FooViewModel(application: Application) : AndroidViewModel(application) {}
- 在活动中创建视图模型
val viewModel = ViewModelProvider(this).get(FooViewModel::class.java)
但是,如果您有一个视图模型使用任何其他构造函数参数扩展AndroidViewModel,则如下所示
- 使用任何其他构造函数扩展 AndroidViewModel 参数
class FooViewModel(application: Application, foo: Foo) : AndroidViewModel(application) {}
- 创建一个扩展 ViewModelProvider.AndroidViewModelFactory 的新视图模型工厂
class FooViewModelFactory(val application: Application, val foo: Foo): ViewModelProvider.AndroidViewModelFactory(application) {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return FooViewModel(
application, foo
) as T
}
}
- 在活动中创建视图模型
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)
编辑:原来的问题现在无关紧要,因为您不应该再使用 ViewModelProviders
实用程序类。相反,您应该创建一个ViewModelProvider
实例,如下所示:
val viewModel = ViewModelProvider(thisFragment).get(MyViewModel::class.java)
原答案如下。
ViewModelProviders
只是一个具有静态方法的实用程序类,因此无需实例化它(反正其中没有实例方法),因此不推荐使用的构造函数应该是一个问题。
使用它的方式是为您的用例调用其适当的of
方法,传入Fragment
或Activity
,然后在返回ViewModelProvider
调用get
:
val viewModel = ViewModelProviders.of(thisFragment).get(MyViewModel::class.java)
如果未在 of
方法的第二个参数中提供自己的工厂,则默认使用 AndroidViewModelFactory
。此实现可以创建没有构造函数参数的 ViewModel 子类,也可以创建扩展AndroidViewModel
子类,如下所示:
class MyViewModel(application: Application) : AndroidViewModel(application) {
// use application
}
试试这段代码
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(UserViewModel::class.java)
你可以像这样使用 AndroidViewModelFactory:
mViewModel = ViewModelProvider(this,
ViewModelProvider.AndroidViewModelFactory(application))
.get(MainViewModel::class.java)
所以,这很简单:
// This is the deprecated way to create a viewModel.
viewModel = ViewModelProviders.of(owner).get(MyViewModel::class.java)
//This is the deprecated way to create a viewModel with a factory.
viewModel = ViewModelProviders.of(owner, mViewModelFactory).get(MyViewModel::class.java)
// This is the new way to create a viewModel.
viewModel = ViewModelProvider(owner).get(MyViewModel::class.java)
//This is the new way to create a viewModel with a factory.
viewModel = ViewModelProvider(owner, mViewModelFactory).get(MyViewModel::class.java)
-
Open build.gradle(Module:~.app)
-
将兼容版本编辑为 1.3.0-alpha02
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'