Rau*_*spe 4 android viewmodel kotlin
在我当前的项目中,我使用下一行:
mViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
例如,ViewModel但在https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders.html#ViewModelProviders() 中推荐使用,ViewModelProvider.AndroidViewModelFactory因为ViewModelProviders()在 API 级别 1.1.0 中已弃用。
为此目的有什么想法吗?
如果你有一个简单的 ViewModel 扩展 AndroidViewModel没有任何额外的构造函数参数,它如下
- 无需任何额外的构造函数参数即可扩展 AndroidViewModel
class FooViewModel(application: Application) : AndroidViewModel(application) {}
Run Code Online (Sandbox Code Playgroud)
- 在活动中创建视图模型
val viewModel = ViewModelProvider(this).get(FooViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
但是如果你有一个 ViewModel 扩展 AndroidViewModel与任何额外的构造函数参数,它如下
- 使用任何额外的构造函数参数扩展 AndroidViewModel
class FooViewModel(application: Application, foo: Foo) : AndroidViewModel(application) {}
Run Code Online (Sandbox Code Playgroud)
- 创建一个新的视图模型工厂扩展 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
}
}
Run Code Online (Sandbox Code Playgroud)
- 在活动中创建视图模型
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
编辑:原来的问题现在无关紧要,因为您不应该再使用ViewModelProviders实用程序类。相反,您应该ViewModelProvider像这样创建一个实例:
val viewModel = ViewModelProvider(thisFragment).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
原答案如下。
ViewModelProviders只是一个具有静态方法的实用程序类,无需实例化它(无论如何,其中没有实例方法),因此不推荐使用构造函数。
使用它的方式是根据of您的用例调用适当的方法,传入 a Fragmentor Activity,然后调用get它ViewModelProvider返回的值:
val viewModel = ViewModelProviders.of(thisFragment).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
如果您没有在方法的第二个参数中提供自己的工厂of,AndroidViewModelFactory则将默认使用。此实现可以创建没有构造函数参数的 ViewModel 子类,也可以创建扩展的 ViewModel 子类AndroidViewModel,如下所示:
class MyViewModel(application: Application) : AndroidViewModel(application) {
// use application
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4168 次 |
| 最近记录: |