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

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


它应该这样工作

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

更新2020-06-16:目前ViewModelProviders已弃用,不应再使用。这个问题和答案来自2018年底,当时情况并非如此。这个问题和答案也适用于ViewModelProviders的旧架构组件版本,而不是AndroidX版本。


当使用最新的依赖项android.arch.lifecycle:extensions:1.1.1时,没有这样的类ViewModelProviders。

是的,有。为了证明这一点:

在Android Studio 3.2.1中创建一个新项目(使用Kotlin, minSdkVersion 21,“空活动”模板) 将android.arch.lifecycle:extensions:1.1.1添加到app模块的依赖项中

这将给你一个应用/构建。gradle:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.commonsware.myandroidarch"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

然后你将看到这个库显示在“外部库”中,并显示该类:

你可以引用这个类:

package com.commonsware.myandroidarch

import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val provider = ViewModelProviders.of(this)
  }
}

在查看ViewModelProviders的文档时,我看到一条评论说:这个类在API级别1.1.0中已弃用。使用ViewModelProvider。AndroidViewModelFactory

该注释位于ViewModelProviders的下面。DefaultFactory类条目,并引用该类,而不是ViewModelProviders:

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

使用ViewModelProviders。


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

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

也许你可以用:

val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)

不需要添加android.arch.lifecycle:extensions:1.1.1作为依赖项。


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


正如@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);

没有传递给你工厂对象。


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

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

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


ViewModelProviders.of()已弃用。

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

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

如果你使用Kotlin,你可以像这样使用属性委托viewModels():

val viewModel: YourViewModel by viewModels()

来源:https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833


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

如果你有这个实现

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

试着使用 viewModel = MainViewModel()


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

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

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

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


试试这个…

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

进口

弃用:

import androidx.lifecycle.ViewModelProviders;

To:

import androidx.lifecycle.ViewModelProvider;

使用

弃用:

ViewModelProviders.of(this, provider).get(VM::class.java)

To:

ViewModelProvider(this, provider).get(VM::class.java)

早在2020年,谷歌已经在androidx生命周期库2.2.0版本中弃用了ViewModelProviders类。

不再需要使用ViewModelProviders来创建ViewModel的实例,您可以将您的Fragment或Activity实例传递给ViewModelProvider构造函数。

如果你使用如下代码:

val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)

你会得到一个警告,ViewModelProviders已被弃用。

要避免使用已弃用的库,请进行以下更改:

In the build.gradle (Module: app) file, use version 2.2.0 of the lifecycle components: implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation "androidx.activity:activity-ktx:1.1.0" If you want to use the ViewModel from a Fragment instead, use implementation "androidx.fragment:fragment-ktx:1.2.2" fragment-ktx automatically includes activity-ktx, so you don't need to specify both in the dependencies. You need to specify Java 8 in the android section : android { compileSdkVersion 28 defaultConfig { applicationId "com.kgandroid.calculator" minSdkVersion 17 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { jvmTarget = "1.8" } } In your Fragment or Activity, change the import to: import androidx.activity.viewModels The code to create a ViewModel then becomes: val viewModel: CalculatorViewModel by viewModels() instead of val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java) Use the viewModel object as : val viewModel: CalculatorViewModel by viewModels() viewModel.newNumber.observe(this, Observer<String> { stringResult -> newNumber.setText(stringResult) }) where newNumer is a LiveData object In a Fragment that you want to share the Activity's ViewModel, you'd use val viewModel: CalculatorViewModel by activityViewModels()

这相当于在(已弃用的)ViewModelProviders.of()函数中传递Activity实例。


实际上,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);

你可以用这个代替:

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

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


这个答案是针对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的实例


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

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

用这个:

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

如果你在Udacity上看了一个视频,你创建了一个GameViewModel,你不想写过时的代码,只需替换:

viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)

使用以下代码:

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

并尽快返回阅读!!


我一直在尝试,最终在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查看当前版本。


我也面临着同样的问题。如果有什么不工作,尝试这段代码到你的oncreate,并根据你的文件编辑它,boom你是GTG

val model = ViewModelProvider(viewModelStore,ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MainActivityViewModel::class.java)

//你只需要改变模型类


我用的是工厂。

ViewModelProvider.AndroidViewModelFactory
            .getInstance(getApplication())
            .create(DashboardViewModel.class);

只需从

ViewModelProviders.of(这 提供者). get (MainActivityViewModel:: class.java)

to

ViewModelProvider(这 提供者). get (MainActivityViewModel:: class.java)


你可以这样使用:

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.

我正在使用生命周期库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()

更新时间:2022年7月20日

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

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

这对我很有用。


//Activity ktx
implementation 'androidx.activity:activity-ktx:1.5.1'

//Fragment ktx
implementation 'androidx.fragment:fragment-ktx:1.5.1'

创建视图模型的最简单方法:

class MyViewModel() : ViewModel() {

}

class SomeActivity:AppCompatActivity(){
  private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_some)
}
}

带有构造函数参数的视图模型:

class MyViewModel(list:List<String>) : ViewModel() {


 class Factory(list:List<String>) : ViewModelProvider.Factory {
        @Suppress("unchecked_cast")
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            return MyViewModel(list) as T
        }
    }
}
class SomeActivity:AppCompatActivity(){

  private val viewModel: MyViewModel by viewModels(){
MyViewModel.Factory(listOf<String>("a"))}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}
}

尝试在构建中添加此代码。Gradle模块级

 android {
 kotlinOptions {
    freeCompilerArgs += [
        '-Xjvm-default=enable'
    ]
  }   
}