Tar*_*ury 32 android android-gradle-plugin android-viewmodel android-architecture-components
在查看的Google文档时ViewModel,他们显示了以下有关如何获取的示例代码ViewModel:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
使用最新的依赖项时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)
Run Code Online (Sandbox Code Playgroud)
因此,方法的名称create每次调用时都会得到一个ViewModel的新实例,这不是我想要的。
有什么想法可以替换上面不推荐使用的代码吗?
COR*_*ian 58
弃用自:
import androidx.lifecycle.ViewModelProviders;Run Code Online (Sandbox Code Playgroud)
到:
import androidx.lifecycle.ViewModelProvider;
Run Code Online (Sandbox Code Playgroud)
弃用自:
ViewModelProviders.of(this, provider).get(VM::class.java)Run Code Online (Sandbox Code Playgroud)
到:
ViewModelProvider(this, provider).get(VM::class.java)
Run Code Online (Sandbox Code Playgroud)
Fan*_*ang 55
我使用生命周期扩展2.2.0-alpha03版本:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03'
Run Code Online (Sandbox Code Playgroud)
使用ViewModelProvider构造函数应该可以正常工作。
// With ViewModelFactory
val viewModel = ViewModelProvider(this, YourViewModelFactory).get(YourViewModel::class.java)
//Without ViewModelFactory
val viewModel = ViewModelProvider(this).get(YourViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
Ken*_*Ken 54
从 2.2.0 开始。生命周期扩展已被弃用。请参阅Google 文档。
这是页面截图:
生命周期扩展中的 API 已被弃用。相反,为您需要的特定 Lifecycle 工件添加依赖项。
新库是:
// 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}"
Run Code Online (Sandbox Code Playgroud)
JAVA的新代码:
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
或者对于 Kotlin:
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
kga*_*oid 37
2020 年初,Google 弃用了 androidx 生命周期库 2.2.0 版中的 ViewModelProviders 类。
不再需要使用 ViewModelProviders 来创建 ViewModel 的实例,您可以将 Fragment 或 Activity 实例传递给 ViewModelProvider 构造函数。
如果您使用以下代码:
val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
您会收到一条警告,指出ViewModelProviders 已被弃用。
为避免使用已弃用的库,请进行以下更改:
在 build.gradle (Module: app) 文件中,使用生命周期组件的 2.2.0 版本:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation "androidx.activity:activity-ktx:1.1.0"
Run Code Online (Sandbox Code Playgroud)
如果您想使用 Fragment 中的 ViewModel,请使用
implementation "androidx.fragment:fragment-ktx:1.2.2"
Run Code Online (Sandbox Code Playgroud)
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" }
}
Run Code Online (Sandbox Code Playgroud)在您的片段或活动中,将导入更改为:
导入 androidx.activity.viewModels
然后创建 ViewModel 的代码变为:
val viewModel: CalculatorViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
代替
val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
将 viewModel 对象用作:
val viewModel: CalculatorViewModel by viewModels()
viewModel.newNumber.observe(this, Observer<String> {
stringResult -> newNumber.setText(stringResult)
})
Run Code Online (Sandbox Code Playgroud)
其中newNumer 是一个 LiveData 对象
在要共享 Activity 的 ViewModel 的 Fragment 中,您可以使用
val viewModel: CalculatorViewModel by activityViewModels()
Run Code Online (Sandbox Code Playgroud)这相当于在(不推荐使用的)ViewModelProviders.of()函数中传递 Activity 实例。
Joh*_*ohn 24
直接使用 ViewModelProvider 构造函数,因为它们现在处理默认的 ViewModelProvider.Factory 角色。
mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)
Ale*_*amo 23
作为@FantasyFang在他的回答中提到,使用最新版本的lifecycle:lifecycle-extensions在这一刻是2.2.0-alpha03。因此,您应该在build.gradle文件中添加以下行:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03'
Run Code Online (Sandbox Code Playgroud)
对于使用Java的用户,要解决此问题,请将这些参数直接传递给ViewModelProvider的构造函数:
MyViewModel viewModel = new ViewModelProvider(this, myViewModelFactory).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
或者,如果您不使用工厂,则只需使用:
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
没有通过您的工厂对象。
xia*_*oyu 18
也许你可以使用:
val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
无需添加android.arch.lifecycle:extensions:1.1.1为依赖项。
Hay*_*yan 14
实际上,该ViewModelProviders.of()方法在幕后做了什么?
@Deprecated
@NonNull
@MainThread
public static ViewModelProvider of(@NonNull Fragment fragment) {
return new ViewModelProvider(fragment);
}
Run Code Online (Sandbox Code Playgroud)
它接受Fragment一个参数,创建ViewModelProvider对象并将片段直接传递给ViewModelProvider构造函数。
我们也可以用同样的方法。
例如之前:
OurViewModel mOurViewModel = ViewModelProviders.of(this).get(OurViewModel.class);
Run Code Online (Sandbox Code Playgroud)
后:
OurViewModel mOurViewModel = new ViewModelProvider(this).get(OurViewModel.class);
Run Code Online (Sandbox Code Playgroud)
小智 13
是的@Tarek,它已被弃用。现在与 AndroidX 一起使用:
val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.java)
Run Code Online (Sandbox Code Playgroud)
小智 12
直接使用 ViewModelProvider 而不是文档中提到的用户 ViewModelProviders.of() 。
ViewModelProvider(this).get(XViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
F.M*_*sir 11
如果您从Udacity创建视频的地方观看视频GameViewModel并且不想编写不推荐使用的代码,只需替换:
viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
并尽快返回阅读!
Com*_*are 10
使用最新的依赖项时
android.arch.lifecycle:extensions:1.1.1,没有此类ViewModelProviders。
就在这里。为了证明这一点:
在Android Studio 3.2.1中创建一个新项目(使用minSdkVersion21岁的Kotlin的“空活动”模板)
添加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'
}
Run Code Online (Sandbox Code Playgroud)
然后,您将看到该类的库显示在“外部库”中:

您将能够引用该类:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
转到ViewModelProviders的文档,我看到一条评论说:该类在API级别1.1.0中已弃用。使用ViewModelProvider.AndroidViewModelFactory
该注释在ViewModelProviders.DefaultFactory类条目下面,并且引用该类,而不是ViewModelProviders:

有什么想法可以替换上面不推荐使用的代码吗?
使用ViewModelProviders。
我正在使用android X,也有这个问题。
首先,您应该将这些依赖项添加到您的Gradle:
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)
就我而言, $lifecycle_version 是 2.2.0-rc02
第二:
导入ViewModelProvider应该是:
import androidx.lifecycle.ViewModelProvider
Run Code Online (Sandbox Code Playgroud)
你可以像下面的例子一样初始化你的视图模型:
val viewModel = ViewModelProvider(this, YourFactoryInstace).get(MainViewModel::class.java)
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
小智 6
用这个:
YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
如果你使用 Kotlin,你可以viewModels()像这样使用属性委托:
val viewModel: YourViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
来源:https : //forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
您可以改用它:
viewModel= ViewModelProvider(this).get(YourViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
括号中的“this”是 YourViewModel 实例的所有者。
| 归档时间: |
|
| 查看次数: |
10502 次 |
| 最近记录: |