查看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每次我调用它,这不是我所追求的。

有什么想法是替换上面已弃用的代码?


当前回答

我不是专家,但我有一行代码,解决了我的问题在Java。希望这能帮助到一些人。

viewModel = 
new ViewModelProvider
.AndroidViewModelFactory(getApplication())
.create(ViewModel.class);

正如我所说,我很乐意提供更多的细节,但这解决了我的这个问题。

其他回答

正如@FantasyFang在他的回答中提到的,使用生命周期的最新版本:lifecycle-extensions,目前是2.2.0-alpha03。所以你应该加入你的构建。Gradle文件如下行:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03' 

对于那些使用Java的人来说,要解决这个问题,可以直接将这些参数传递给ViewModelProvider的构造函数:

MyViewModel viewModel = new ViewModelProvider(this, myViewModelFactory).get(MyViewModel.class);

或者如果你不使用工厂,简单地使用:

MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);

没有传递给你工厂对象。

从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)

我正在使用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)

我正在使用生命周期库2.3.1,并在构建中添加以下依赖项。gradle(模块级)

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-extensions-ktx:2.2.0'
implementation 'androidx.activity:activity-ktx:1.4.0'
implementation 'androidx.fragment:fragment-ktx:1.3.6'

在你的Kotlin代码中声明viewModels(),如下所示:

import androidx.fragment.app.viewModels

private val cartViewModel: CartViewModel by viewModels()

是的@Tarek,已经被弃用了。现在使用AndroidX:

val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.java)