查看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的,但你可以理解要点。解决方案是你需要使用ViewModelProvider,因为ViewModelProviders已弃用:

//Do not forget import it.
import androidx.lifecycle.AndroidViewModel;

ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

示例用法如下:

YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

另外,不要忘记更新Gradle Dependencies:查看它们的最新版本

implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'

! !然而,要小心,因为一些答案推荐了这个解决方案,但对我来说并不管用:

yourViewModel = new ViewModelProvider(this).get(YourViewModel.class);

因为当我使用这种方式时,我得到了下面的错误消息:

导致原因:java.lang.RuntimeException:不能创建类com. canerkasler .mvvmexample. viewmodel的实例

其他回答

直接使用ViewModelProvider,而不是像文档中提到的那样使用ViewModelProviders.of()。

ViewModelProvider(this).get(XViewModel::class.java)

https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders

用这个:

YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.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);

没有传递给你工厂对象。

更新时间:2022年7月20日

私人 lateinite 被绑定:碎片主页绑定 私人后期是家MvvM : 家视图模型

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    homeMvvM = ViewModelProvider(this)[HomeViewModel::class.java]

这对我很有用。

你可以用这个代替:

viewModel= ViewModelProvider(this).get(YourViewModel::class.java)

括号中的"this"是YourViewModel实例的所有者。