ViewModelProviders在1.1.0中已弃用

查看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时,无法找到等效的of方法来获取ViewModel的实例。

我尝试做的事情:

ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)

因此方法create的名字,我每次调用ViewModel都会得到一个新的实例,这不是我所追求的。

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

128429 次浏览

它应该这样工作

 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, "empty activity"模板)

  • android.arch.lifecycle:extensions:1.1.1添加到app模块的依赖项中

这将给你一个app/build.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#viewmodels

2020/06/25:修正了委托的大小写

正如@FantasyFang在他的回答中提到的,使用lifecycle: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()已弃用。 enter image description here < / p >

直接使用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() < / p >

从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已弃用。

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

  1. 在构建中。gradle (Module: app)文件,使用2.2.0版本的生命周期 组件:< / p >

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation "androidx.activity:activity-ktx:1.1.0"
    

    如果你想使用片段中的ViewModel,请使用

    implementation "androidx.fragment:fragment-ktx:1.2.2"
    

    fragment-ktx自动包含activity-ktx, 所以你不需要 在依赖项中指定两者。

  2. 你需要在android部分指定Java 8:

    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" }
    }
    
  3. In your Fragment or Activity, change the import to:

    import androidx.activity.viewModels

  4. The code to create a ViewModel then becomes:

    val viewModel: CalculatorViewModel by viewModels()
    

    而不是

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

    使用viewModel对象如下:

    val viewModel: CalculatorViewModel by viewModels()
    
    
    viewModel.newNumber.observe(this, Observer<String> {
    stringResult -> newNumber.setText(stringResult)
    })
    

    newnumber是一个LiveData对象

    在你想要共享Activity的ViewModel的Fragment中,你可以使用

    val viewModel: CalculatorViewModel by activityViewModels()
    

That's the equivalent of passing the Activity instance in the (deprecated) ViewModelProviders.of() function.

实际上,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弃用: . 0

//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 < / >强的依赖性: 点击这里查看最新版本

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

只需从

< p > ViewModelProviders.of(这 提供者). get (MainActivityViewModel:: class.java) < / p >

< p > ViewModelProvider(这 提供者). get (MainActivityViewModel:: class.java) < / p >

你可以这样使用:

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,并在build.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'

在你的芬兰湾的科特林代码中声明< >强视图模型()< / >强,如下所示:

import androidx.fragment.app.viewModels


private val cartViewModel: CartViewModel by viewModels()

更新时间:2022年7月20日

private lateinit var binding: FragmentHomeBinding private lateinit var homamevvm: HomeViewModel

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'
]
}
}