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.AndroidViewModelFactory
、of
のインスタンスを取得するための同等のViewModel
メソッドが見つかりません。
私がやろうとしたこと:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.Java)
したがって、メソッドcreate
の名前は、呼び出すたびにViewModelの新しいインスタンスを取得します。これは、私が求めているものではありません。
上記の廃止されたコードの置き換えは何ですか?
最新の依存関係
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'
}
その後、ライブラリがそのクラスの「外部ライブラリ」に表示されることがわかります。
そして、あなたはそのクラスを参照することができます:
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
を使用します。
私はライフサイクル拡張機能を使用しています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)
@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);
ファクトリオブジェクトを渡さないでください。
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)
はい@Tarek、それは非推奨です。今すぐAndroidXで使用:
val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.Java)
ドキュメントに記載されているように、ユーザーViewModelProviders.of()ではなく、直接ViewModelProviderを使用します。
ViewModelProvider(this).get(XViewModel::class.Java)
https://developer.Android.com/reference/androidx/lifecycle/ViewModelProviders
私は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)
おそらくあなたはちょうど使うことができます:
val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.Java)
依存関係としてAndroid.Arch.lifecycle:extensions:1.1.1
を追加する必要はありません。
非推奨:ViewModelProviders.of(this, provider).get(VM::class.Java)
To:ViewModelProvider(this, provider).get(VM::class.Java)
Kotlinを使用する場合は、次のようにプロパティデリゲートviewModels()
を使用できます。
val viewModel: YourViewModel by viewModels()
ソース: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/168
私はエキスパートではありませんが、Javaでの問題を解決するコード行があります。これが誰かを助けることを願っています。
viewModel =
new ViewModelProvider
.AndroidViewModelFactory(getApplication())
.create(ViewModel.class);
詳細を提供したいのですが、これでこの問題は解決しました。
2020年初頭、Googleは、androidxライフサイクルライブラリのバージョン2.2.0で、ViewModelProvidersクラスを廃止しました。
ViewModelProvidersを使用してViewModelのインスタンスを作成する必要はなくなりました。代わりに、FragmentまたはActivityインスタンスをViewModelProviderコンストラクターに渡すことができます。
次のようなコードを使用する場合:
_val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.Java)
_
ViewModelProvidersが廃止されたという警告が表示されます。
非推奨のライブラリを使用しないようにするには、次の変更を行います。
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が含まれるため、依存関係で両方を指定する必要はありません。
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" }
}
_
フラグメントまたはアクティビティで、インポートを次のように変更します。
import androidx.activity.viewModels
次に、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インスタンスを渡すことと同じです。
実際、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);
実装 'androidx.lifecycle:lifecycle-extensions:2.2.0-rc03'
leftRightViewModel = ViewModelProvider.AndroidViewModelFactory(application).create(LeftRightViewModel::class.Java)
この実装がある場合
_'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
の手順は次のとおりです 正しい依存関係を持つプロジェクト の設定方法の手順はここにあります
このように機能するはずです
viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.Java)