1.1.0中不推荐使用ViewModelProviders

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)

  • 正是我正在寻找的。 (5认同)

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)

  • Java 等效项: `YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);` (40认同)
  • 我担心有一天 Google 会弃用“TextView”或“EditText”并引入一个新组件。 (26认同)
  • 我有点讨厌Google持续不断的“折旧”周期。 (16认同)
  • androidx生命周期视图模型2.1.0没有没有工厂的构造函数。简单地使用(这个)是行不通的。ViewModelProvider(ViewModelStoreOwner, Factory) 和 ViewModelProvider(ViewModelStore, Factory) 是唯一的构造函数 (4认同)
  • ViewModelProviders.of() 已被弃用。您可以将 Fragment 或 FragmentActivity 传递给新的 ViewModelProvider(ViewModelStoreOwner) 构造函数以实现相同的功能。(aosp/1009889) (3认同)
  • 当软件发展时,旧的实现就会被弃用。这是自然的事,对抗是没有用的。 (2认同)

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

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

  1. 在 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,因此您无需在依赖项中同时指定两者。

  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" }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在您的片段或活动中,将导入更改为:

    导入 androidx.activity.viewModels

  4. 然后创建 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

ViewModelProviders.of() 已被弃用。 在此处输入图片说明

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

  • 这个答案是错误的。您应该使用“ViewModelProvider(viewModelStoreOwner,factory).get(YourVideoModel::class.java)”,否则您的“onCleared()”将无法正常工作,并且 ViewModel 将不会在配置更改中保留。**不要使用这个答案。** (16认同)

小智 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.1app模块的依赖项

这会给你一个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

  • 这不再是真的,“ViewModelProviders.of()”不再存在。 (29认同)

Igo*_*man 9

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


LCZ*_*LCZ 5

如果你使用 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


Ami*_*min 5

您可以改用它:

viewModel= ViewModelProvider(this).get(YourViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

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