web-dev-qa-db-fra.com

ViewModelProviders est obsolète en 1.1.0

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?

3
TareK Khoury

Lorsque vous utilisez la dernière dépendance Android.Arch.lifecycle:extensions:1.1.1, il n'existe pas de classe ViewModelProviders.

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:

External Libraries

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:

Documentation Screenshot

Des idées ce qui est le remplacement du code obsolète ci-dessus?

Utilisez ViewModelProviders.

3
CommonsWare

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

 enter image description here

 enter image description here

0
Haroun Hajem

ça devrait marcher comme ça 

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