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

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


当前回答

我使用生命周期扩展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:修正了委托的大小写

其他回答

它应该这样工作

 viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.java)

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

val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::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:修正了委托的大小写

你可以这样使用:

private  val sharedViewModel: SharedViewModel by viewModels(ownerProducer = { requireActivity() })


ownerProducer = { requireActivity() } // This is only required if you want to share same view model among different fragments.

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

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

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