ViewModelProviders 在 1.1.0 中被弃用
ViewModelProviders is deprecated in 1.1.0
查看 ViewModel
的 Google docs,他们显示了以下示例代码如何获得 ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
当使用最新的依赖项时 android.arch.lifecycle:extensions:1.1.1
没有 class ViewModelProviders
.
去 documentation 参加 ViewModelProviders
,我看到一条评论说:
This class was deprecated in API level 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
问题是,当尝试使用 ViewModelProvider.AndroidViewModelFactory
时,找不到等效的 of
方法来获取 ViewModel
.
的实例
我尝试做的事情:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
因此方法的名称 create
,我每次调用它时都会得到一个 ViewModel 的新实例,这不是我想要的。
知道什么是上面已弃用代码的替代品吗?
它应该这样工作
viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.java)
更新 2020-06-16:目前 ViewModelProviders
已弃用,不应再使用。这个问题和答案来自 2018 年底,当时情况并非如此。这个问题和答案也适用于 ViewModelProviders
的旧架构组件版本,而不是 AndroidX 版本。
When using the latest dependency android.arch.lifecycle:extensions:1.1.1
there is no such class 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'
}
然后您会看到该库显示在 "External Libraries" 中 class:
你将能够引用 class:
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)
}
}
Going to the documentation for ViewModelProviders, I saw a comment saying: This class was deprecated in API level 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
该评论位于 ViewModelProviders.DefaultFactory
class 条目下方,指的是 class,而不是 ViewModelProviders
:
Any ideas what is the replacement of deprecated code above?
使用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
。因此,您应该在 build.gradle 文件中添加以下行:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03'
对于那些使用 Java 的人,要解决这个问题,请将这些参数直接传递给 ViewModelProvider 的 constructor:
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.Factory 角色。
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 开始。生命周期扩展已被弃用。参考Google Documentation.
这是从页面截取的内容:
The APIs in lifecycle-extensions have been deprecated. Instead, add
dependencies for the specific Lifecycle artifacts you need.
新库是:
// 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);
导入
弃用自:
<strike>import androidx.lifecycle.ViewModelProviders;</strike>
收件人:
import androidx.lifecycle.ViewModelProvider;
使用
弃用自:
<strike>ViewModelProviders.of</strike>(this, provider).get(VM::class.java)
收件人:
ViewModelProvider(this, provider).get(VM::class.java)
2020 年初,Google 在 androidx 生命周期库的 2.2.0 版中弃用了 ViewModelProviders class。
不再需要使用 ViewModelProviders 来创建 ViewModel 的实例,您可以将 Fragment 或 Activity 实例传递给 ViewModelProvider 构造函数。
如果您使用如下代码:
val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
您会收到一条警告,指出 ViewModelProviders 已被弃用。
为避免使用已弃用的库,请进行以下更改:
在build.gradle(Module:app)文件中,使用2.2.0版本的lifecycle
组件:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation "androidx.activity:activity-ktx:1.1.0"
如果您想使用 Fragment 中的 ViewModel,请使用
implementation "androidx.fragment:fragment-ktx:1.2.2"
fragment-ktx 自动包含 activity-ktx,所以你不需要
在依赖项中指定两者。
您需要在 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" }
}
在您的 Fragment 或 Activity 中,将导入更改为:
导入androidx.activity.viewModels
创建 ViewModel 的代码变为:
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)
})
其中 newNumer 是一个 LiveData 对象
在要共享 Activity 的 ViewModel 的片段中,您将使用
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 deprecated:
//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 依赖项:Check here for last versions of them
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'
!!!但是,要小心,因为一些答案推荐这个解决方案,但它对我不起作用:
yourViewModel = new ViewModelProvider(this).get(YourViewModel.class);
因为我使用这种方式时,出现了以下错误信息:
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.canerkaseler.mvvmexample.ViewModel
当你使用 dagger 时,你将在构造函数中传递工厂
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)
和return尽快回到阅读!!
我一直在尝试并最终在 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 中,并根据您的文件进行编辑,然后您就是 gtg
val model = ViewModelProvider(viewModelStore,ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MainActivityViewModel::class.java)
//你只需要改变模型class
我正在使用工厂。
ViewModelProvider.AndroidViewModelFactory
.getInstance(getApplication())
.create(DashboardViewModel.class);
只需从
更新
ViewModelProviders.of(this,
provider).get(MainActivityViewModel::class.java)
至
ViewModelProvider(this,
provider).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.
我正在使用 Library of Lifecycle 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'
在您的 Kotlin 代码中声明 viewModels():
import androidx.fragment.app.viewModels
private val cartViewModel: CartViewModel by viewModels()
查看 ViewModel
的 Google docs,他们显示了以下示例代码如何获得 ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
当使用最新的依赖项时 android.arch.lifecycle:extensions:1.1.1
没有 class ViewModelProviders
.
去 documentation 参加 ViewModelProviders
,我看到一条评论说:
This class was deprecated in API level 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
问题是,当尝试使用 ViewModelProvider.AndroidViewModelFactory
时,找不到等效的 of
方法来获取 ViewModel
.
我尝试做的事情:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
因此方法的名称 create
,我每次调用它时都会得到一个 ViewModel 的新实例,这不是我想要的。
知道什么是上面已弃用代码的替代品吗?
它应该这样工作
viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.java)
更新 2020-06-16:目前 ViewModelProviders
已弃用,不应再使用。这个问题和答案来自 2018 年底,当时情况并非如此。这个问题和答案也适用于 ViewModelProviders
的旧架构组件版本,而不是 AndroidX 版本。
When using the latest dependency
android.arch.lifecycle:extensions:1.1.1
there is no such classViewModelProviders
.
是的,有。为了证明这一点:
在 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'
}
然后您会看到该库显示在 "External Libraries" 中 class:
你将能够引用 class:
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)
}
}
Going to the documentation for ViewModelProviders, I saw a comment saying: This class was deprecated in API level 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
该评论位于 ViewModelProviders.DefaultFactory
class 条目下方,指的是 class,而不是 ViewModelProviders
:
Any ideas what is the replacement of deprecated code above?
使用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
。因此,您应该在 build.gradle 文件中添加以下行:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03'
对于那些使用 Java 的人,要解决这个问题,请将这些参数直接传递给 ViewModelProvider 的 constructor:
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.Factory 角色。
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 开始。生命周期扩展已被弃用。参考Google Documentation.
这是从页面截取的内容:
The APIs in lifecycle-extensions have been deprecated. Instead, add dependencies for the specific Lifecycle artifacts you need.
新库是:
// 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);
导入
弃用自:
<strike>import androidx.lifecycle.ViewModelProviders;</strike>
收件人:
import androidx.lifecycle.ViewModelProvider;
使用
弃用自:
<strike>ViewModelProviders.of</strike>(this, provider).get(VM::class.java)
收件人:
ViewModelProvider(this, provider).get(VM::class.java)
2020 年初,Google 在 androidx 生命周期库的 2.2.0 版中弃用了 ViewModelProviders class。
不再需要使用 ViewModelProviders 来创建 ViewModel 的实例,您可以将 Fragment 或 Activity 实例传递给 ViewModelProvider 构造函数。
如果您使用如下代码:
val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
您会收到一条警告,指出 ViewModelProviders 已被弃用。
为避免使用已弃用的库,请进行以下更改:
在build.gradle(Module:app)文件中,使用2.2.0版本的lifecycle 组件:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation "androidx.activity:activity-ktx:1.1.0"
如果您想使用 Fragment 中的 ViewModel,请使用
implementation "androidx.fragment:fragment-ktx:1.2.2"
fragment-ktx 自动包含 activity-ktx,所以你不需要 在依赖项中指定两者。
您需要在 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" } }
在您的 Fragment 或 Activity 中,将导入更改为:
导入androidx.activity.viewModels
创建 ViewModel 的代码变为:
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) })
其中 newNumer 是一个 LiveData 对象
在要共享 Activity 的 ViewModel 的片段中,您将使用
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 deprecated:
//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 依赖项:Check here for last versions of them
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'
!!!但是,要小心,因为一些答案推荐这个解决方案,但它对我不起作用:
yourViewModel = new ViewModelProvider(this).get(YourViewModel.class);
因为我使用这种方式时,出现了以下错误信息:
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.canerkaseler.mvvmexample.ViewModel
当你使用 dagger 时,你将在构造函数中传递工厂
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)
和return尽快回到阅读!!
我一直在尝试并最终在 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 中,并根据您的文件进行编辑,然后您就是 gtg
val model = ViewModelProvider(viewModelStore,ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MainActivityViewModel::class.java)
//你只需要改变模型class
我正在使用工厂。
ViewModelProvider.AndroidViewModelFactory
.getInstance(getApplication())
.create(DashboardViewModel.class);
只需从
更新ViewModelProviders.of(this, provider).get(MainActivityViewModel::class.java)
至
ViewModelProvider(this, provider).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.
我正在使用 Library of Lifecycle 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'
在您的 Kotlin 代码中声明 viewModels():
import androidx.fragment.app.viewModels
private val cartViewModel: CartViewModel by viewModels()