En regardant les Google Docs pour ViewModel
, ils montrent l'exemple de code ci-dessous sur la façon d'obtenir une ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.Java)
Lorsque vous utilisez la dernière dépendance Android.Arch.lifecycle:extensions:1.1.1
, il n'existe pas de classe ViewModelProviders
.
En allant dans la documentation pour ViewModelProviders
, j’ai vu un commentaire dire:
Cette classe est obsolète dans l'API niveau 1.1.0. Utilisez ViewModelProvider.AndroidViewModelFactory
Le problème est que, lorsque vous essayez d'utiliser ViewModelProvider.AndroidViewModelFactory
, vous ne pouvez pas trouver une méthode of
équivalente pour obtenir l'instance de ViewModel
.
Ce que j'ai essayé de faire:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.Java)
D'où le nom de la méthode create
, j'obtiens une nouvelle instance du ViewModel chaque fois que je l'appelle, ce qui n'est pas ce que je recherche.
Des idées ce qui est le remplacement du code obsolète ci-dessus?
Lorsque vous utilisez la dernière dépendance
Android.Arch.lifecycle:extensions:1.1.1
, il n'existe pas de classeViewModelProviders
.
Oui il y a. Pour le démontrer:
Créer un nouveau projet dans Android Studio 3.2.1 (avec Kotlin, minSdkVersion
21, modèle "activité vide")
Ajoutez Android.Arch.lifecycle:extensions:1.1.1
aux dépendances du module app
Cela vous donnera un app/build.gradle
comme:
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'
}
Vous verrez alors cette bibliothèque apparaître dans "Bibliothèques externes" avec cette classe:
Et vous pourrez référencer cette classe:
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)
}
}
En consultant la documentation de ViewModelProviders, j’ai lu un commentaire disant: Cette classe était obsolète dans l’API niveau 1.1.0. Utilisez ViewModelProvider.AndroidViewModelFactory
Ce commentaire se trouve sous l'entrée de la classe ViewModelProviders.DefaultFactory
et fait référence à cette classe et non à ViewModelProviders
:
Des idées ce qui est le remplacement du code obsolète ci-dessus?
Utilisez ViewModelProviders
.
Il n'y a rien dans la méthode get
qui soit deprecated
. Si vous suivez les instructions du développeur Android, vous devriez obtenir la VM
comme ceci.
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
});
}
}
Voici les instructions sur comment utiliser ViewModels
Voici les instructions sur la manière de configurer votre projet avec les bonnes dépendances
ça devrait marcher comme ça
viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.Java)