web-dev-qa-db-ja.com

ViewModelProvidersは1.1.0で廃止されました

ViewModelの-​​ Google docs を見ると、ViewModelを取得する方法に関する以下のサンプルコードが表示されています。

val model = ViewModelProviders.of(this).get(MyViewModel::class.Java)

最新の依存関係を使用する場合Android.Arch.lifecycle:extensions:1.1.1そのようなクラスはありませんViewModelProviders

ViewModelProvidersの-​​ documentation に移動すると、次のようなコメントが表示されました。

このクラスはAPIレベル1.1.0で廃止されました。 ViewModelProvider.AndroidViewModelFactoryを使用します

問題は、ViewModelProvider.AndroidViewModelFactoryofのインスタンスを取得するための同等のViewModelメソッドが見つかりません。

私がやろうとしたこと:

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

したがって、メソッドcreateの名前は、呼び出すたびにViewModelの新しいインスタンスを取得します。これは、私が求めているものではありません。

上記の廃止されたコードの置き換えは何ですか?

97
TareK Khoury

最新の依存関係Android.Arch.lifecycle:extensions:1.1.1を使用する場合、そのようなクラスViewModelProvidersはありません。

はいあります。これを実証するには:

  • Android Studio 3.2.1で新しいプロジェクトを作成します(Kotlin、minSdkVersion 21、「空のアクティビティ」テンプレートを使用))

  • appモジュールの依存関係にAndroid.Arch.lifecycle:extensions:1.1.1を追加します

これにより、次のような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

そして、あなたはそのクラスを参照することができます:

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ではなく、そのクラスを参照しています。

Documentation Screenshot

上記の廃止されたコードの置き換えは何ですか?

ViewModelProvidersを使用します。

23
CommonsWare

私はライフサイクル拡張機能を使用しています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)
191
Fantasy Fang

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

ファクトリオブジェクトを渡さないでください。

43
Alex Mamo

2.2.0以降。ライフサイクル拡張機能は廃止されました。 Google Documentation を参照してください。

これはページからのカットです:

ライフサイクル拡張の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)
16
Kenneth Argo

はい@Tarek、それは非推奨です。今すぐAndroidXで使用:

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

ViewModelProviders.of()は廃止されました。 enter image description here

デフォルトのViewModelProvider.Factoryロールを処理するようになったので、ViewModelProviderコンストラクターを直接使用します。

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

ドキュメントに記載されているように、ユーザーViewModelProviders.of()ではなく、直接ViewModelProviderを使用します。

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

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

8
Ilyas

私はAndroid Xを使用していますが、この問題もありました。

まず第一に、これらの依存関係をGradleに追加する必要があります:

implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" 

私の場合、$ lifecycle_versionは2.2.0-rc02でした

2番目:ViewModelProviderのインポートは次のようになります。

import androidx.lifecycle.ViewModelProvider

以下の例のように、vIewModelを初期化できます。

val viewModel = ViewModelProvider(this, YourFactoryInstace).get(MainViewModel::class.Java)

val viewModel = ViewModelProvider(this).get(MainViewModel::class.Java)
8
Igor Fridman

おそらくあなたはちょうど使うことができます:

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

依存関係としてAndroid.Arch.lifecycle:extensions:1.1.1を追加する必要はありません。

7
xiaoyu

非推奨:ViewModelProviders.of(this, provider).get(VM::class.Java)

To:ViewModelProvider(this, provider).get(VM::class.Java)

7
CORONEL Braian

Kotlinを使用する場合は、次のようにプロパティデリゲートviewModels()を使用できます。

val viewModel: YourViewModel by viewModels()

ソース: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/168

5
LCZ

私はエキスパートではありませんが、Javaでの問題を解決するコード行があります。これが誰かを助けることを願っています。

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

詳細を提供したいのですが、これでこの問題は解決しました。

4
ZeePee

2020年初頭、Googleは、androidxライフサイクルライブラリのバージョン2.2.0で、ViewModelProvidersクラスを廃止しました。

ViewModelProvidersを使用してViewModelのインスタンスを作成する必要はなくなりました。代わりに、FragmentまたはActivityインスタンスをViewModelProviderコンストラクターに渡すことができます。

次のようなコードを使用する場合:

_val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.Java)
_

ViewModelProvidersが廃止されたという警告が表示されます。

非推奨のライブラリを使用しないようにするには、次の変更を行います。

  1. Build.gradle(モジュール:アプリ)ファイルで、ライフサイクルコンポーネントのバージョン2.2.0を使用します:_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. JavaセクションでAndroid 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. フラグメントまたはアクティビティで、インポートを次のように変更します。

    import androidx.activity.viewModels

  4. 次に、ViewModelを作成するコードは次のようになります。

    val viewModel: CalculatorViewModel by viewModels()

    の代わりに

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

    としてviewModelオブジェクトを使用します

    val viewModel:viewModels()によるCalculatorViewModel

    viewModel.newNumber.observe(this、Observer {stringResult-> newNumber.setText(stringResult)})

    ここでnewNumerはLiveDataオブジェクトです

    アクティビティのViewModelを共有するフラグメントでは、次を使用します

    val viewModel: CalculatorViewModel by activityViewModels()

    これは、(非推奨の)ViewModelProviders.of()関数でActivityインスタンスを渡すことと同じです。

3
kgandroid

実際、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);
2
Hayk Mkrtchyan

実装 'androidx.lifecycle:lifecycle-extensions:2.2.0-rc03'

leftRightViewModel = ViewModelProvider.AndroidViewModelFactory(application).create(LeftRightViewModel::class.Java)
0
user2288580

この実装がある場合

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

viewModel = MainViewModel()を使用してみてください

getであるdeprecatedメソッドについては何もありません。 Android開発者の指示に従う場合は、このようにVMを取得する必要があります。

public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
    // Create a ViewModel the first time the system calls an activity's onCreate() method.
    // Re-created activities receive the same MyViewModel instance created by the first activity.

    MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
    model.getUsers().observe(this, users -> {
        // update UI
    });
  }
}

使用方法ViewModels の手順は次のとおりです 正しい依存関係を持つプロジェクト の設定方法の手順はここにあります

enter image description here

enter image description here

0
Haroun Hajem

このように機能するはずです

 viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.Java)
0
Hamdi Hanbali