查看ViewModel的谷歌文档,他们展示了下面如何获取ViewModel的示例代码:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
当使用最新的依赖项android.arch.lifecycle:extensions:1.1.1时,没有这样的类ViewModelProviders。
去查看ViewModelProviders的文档,我看到一条评论说:
这个类在API级别1.1.0中已弃用。使用ViewModelProvider。AndroidViewModelFactory
问题是,当尝试使用ViewModelProvider时。AndroidViewModelFactory,找不到一个等效的方法来获取ViewModel的实例。
我尝试做的事情:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
因此,方法的名称创建,我得到一个新的实例的ViewModel每次我调用它,这不是我所追求的。
有什么想法是替换上面已弃用的代码?
我一直在尝试,最终在Kotlin中得到了这个解决方案,你应该也可以在java中尝试它。
MainActivity.kt
val provider : ViewModelProvider = ViewModelProvider(this)
val VM = provider.get(ViewModelClass::class.java)
build.gradle
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0"
截至2021年2月2日,生命周期库的当前版本为2.3.0,请参阅https://developer.android.com/jetpack/androidx/releases/lifecycle查看当前版本。
从2.2.0开始。生命周期扩展已弃用。请参考谷歌文档。
这是这一页的剪接:
生命周期扩展中的api已弃用。相反,添加
您所需要的特定生命周期工件的依赖关系。
新的库包括:
// ViewModel and lifecycle support for java
implementation "androidx.lifecycle:lifecycle-viewmodel:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-livedata:${versions.lifecycle}"
// ViewModel and lifecycle support for kotlin
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:${versions.lifecycle}"
JAVA的新代码:
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
或者对于Kotlin来说:
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
我使用生命周期扩展2.2.0版本:
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
它应该工作,使用ViewModelProvider构造函数。
// With ViewModelFactory
val viewModel = ViewModelProvider(this, YourViewModelFactory).get(YourViewModel::class.java)
//Without ViewModelFactory
val viewModel = ViewModelProvider(this).get(YourViewModel::class.java)
2020/5/15更新
我发现了另一种优雅的方式来实现这一点,Android KTX可以帮助
implementation "androidx.fragment:fragment-ktx:1.2.4"
val viewmodel: MYViewModel by viewModels()
val viewmodel: MYViewModel by viewModels { myFactory } //With factory
裁判:https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary #视图模型
2020/06/25:修正了委托的大小写
我正在使用android X,也有这个问题。
首先,你应该把这些依赖项添加到Gradle中:
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
在我的例子中,$lifecycle_version是2.2.0-rc02
第二:
ViewModelProvider的导入应该是:
import androidx.lifecycle.ViewModelProvider
然后你可以像下面的例子一样初始化你的vIewModel:
val viewModel = ViewModelProvider(this, YourFactoryInstace).get(MainViewModel::class.java)
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)