查看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.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()

其他回答

试试这个…

 LocationViewModel locationViewModel = new ViewModelProvider(this).get(LocationViewModel.class);

实际上,ViewModelProviders.of()方法在底层做什么?

@Deprecated
@NonNull
@MainThread
public static ViewModelProvider of(@NonNull Fragment fragment) {
    return new ViewModelProvider(fragment);
}

它以Fragment作为参数,创建ViewModelProvider对象,并将片段直接传递给ViewModelProvider构造函数。

我们也可以用同样的方法。

例如:

OurViewModel mOurViewModel = ViewModelProviders.of(this).get(OurViewModel.class);

后:

OurViewModel mOurViewModel = new ViewModelProvider(this).get(OurViewModel.class);

ViewModelProviders.of()已弃用。

直接使用ViewModelProvider构造函数,因为它们现在处理默认的ViewModelProvider。工厂的角色。

 mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

当你使用dagger时,你将在构造函数中传递factory

  MobileViewModel mobileViewModel = new ViewModelProvider(this,providerFactory).get(MobileViewModel.class);

如果你有这个实现

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

试着使用 viewModel = MainViewModel()