Impossible de résoudre le symbole ViewModelProviders sur AppCompatActivity

122

Hé, j'essaie de faire fonctionner mon ViewModel, mais pas de chance pour l'instant. Android Studio affiche une erreur Cannot resolve symbol 'ViewModelProviders'.

Chaque autre question que je trouve sur ce sujet corrigeait extends Activityà extends AppCompatActivity, mais je tends la bonne. Je ne sais pas ce qu'il me manque ...
Mon code est basé sur cette vidéo YouTube

MainActivity.java

public class MainActivity extends AppCompatActivity implements
    TileAdapter.TileAdapterOnClickHandler {


private BaseViewModel viewModel;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //set Toolbar
    Toolbar myToolbar = findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);


    //initialize viewModel
    viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);

BaseViewModel.java

public class BaseViewModel extends ViewModel {

private Movie[] mMovie;

public void init (Movie[] movies){
    this.mMovie = movies;
}

public Movie[] getMovie() {
    return mMovie;
}
Sheler
la source
1
«Impossible de résoudre le symbole» signifie que soit vous n'avez pas l' importinstruction, soit vous l'avez mais vous n'avez pas la dépendance dans votre configuration Gradle.
CommonsWare
9
Vérifiez si vous avez une dépendance pour android.arch.lifecycle: extensions dans build.gradle
Muthukrishnan Rajendran
Soit il utilise une bibliothèque et ajoute la dépendance dans le fichier gradle pour pouvoir importer ViewModel, soit il a une classe personnalisée ViewModelsous le package différent et il l'importe à partir de là
Akshay Katariya
N'avait pas d'extensions en tant que dépendance. Merci @MuthukrishnanRajendran
Sheler

Réponses:

203

Je n'avais pas les deux dépendances dans ma version, d'où le problème.

implementation "android.arch.lifecycle:extensions:1.1.0"
implementation "android.arch.lifecycle:viewmodel:1.1.0"

Merci @Muthukrishnan Rajendran

Sheler
la source
7
@Sheler Votre réponse est correcte mais la documentation est fausse. Dans la documentation, il est spécifié que ViewModel et LiveDat sont tous deux dans l'implémentation "android.arch.lifecycle: extensions: 1.1.1"
Pritish
2
Hmm, cette solution n'a toujours pas résolu mon problème. J'ai l'implémentation "android.arch.lifecycle: extensions: 1.1.1" dans mon application gradle et allprojects {repositories {google () jcenter ()}} Y a-t-il autre chose à ajouter?
musterjunk
1
Je vois la classe ViewModelProvider mais elle n'a pas la méthode .of (). ViewModelProviders n'est toujours pas défini. Je suis sur un mac si cela compte.
musterjunk
Y a-t-il une définition min sdk ou java 8 qui doit être ajoutée au projet?
musterjunk
Ça ne fait rien. Assurez-vous de synchroniser vos fichiers de notes s'il n'apparaît pas.
musterjunk
96

Si vous utilisez, androidxvous en avez besoin:

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
Babao
la source
Pour toute personne ayant ce problème, vous avez également besoin de ceci dans votre application gradle: apply plugin: 'androidx.navigation.safeargs' et ceci dans votre android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Si vous ne parvenez pas à placer ces choses, regardez dans l'application de démonstration android-sunflower de google.
findusl
1
vérifiez ce lien pour la dernière version d'androidx developer.android.com/jetpack/androidx/migrate
user2301281
Quelle est la stupidité! ViewModelProvider est disponible sans dépendance mais pour ViewModelProviders, nous avons besoin d'une dépendance supplémentaire.
Rahul Rastogi
15

Si vous utilisez sdk compilé version 28 ou supérieure, il vous suffit d'ajouter une seule dépendance pour obtenir ViewModeletLiveData

dependencies {
    //...
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}
Sanjeev
la source
Pour connaître la dernière version de, android.arch.lifecycle:extensionsvous pouvez rechercher extensionsdans maven.google.com/web/index.html et voir la dernière version
Sanjeev
11

android.arch.lifecycle: l'utilisation des extensions est obsolète

def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"

Créez une instance de viewmodel comme ceci:

Java

Yourclass obj = new ViewModelProvider(context).get(ClassViewModel.class);

Kotlin

var obj = ViewModelProvider(context).get(ClassViewModel::class.java)
Sumit Shukla
la source
5

vous devez ajouter une bibliothèque dans build.gradle de votre projet

def lifecycle_version = "2.0.0"

// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
Fatih Çakıroğlu
la source
5

Je résous ce problème à partir de la documentation officielle d'Android . Ajouter ci-dessous àbuild.grale

def lifecycle_version = "2.0.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
shellhub
la source
5

Dans mon cas (Android Studio 3.6.3), AppCompatActivitypour réussir à faire:

MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);

il faut à la fois:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

(seul avec lifecycle-extentionsn'était pas suffisant)

hata
la source
3

Dans le fichier build.gradle, ajoutez ces lignes dans le bloc des dépendances

dependencies {
...
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
//if not using java 8,use the following line
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
//if using java 8,ignore above line and add the following line
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
...
}

Exemple d'image du fichier build.gradle

Sulav Timsina
la source
2

Utiliser les androixbibliothèques

Changement

implementation 'com.android.support:appcompat-v7:28.0.0'

à

implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'

Vous pouvez utiliser

Refactor>Migrate to AndroidX
Sébastien Duran
la source
2

Dans la mise en œuvre "androidx.lifecycle: lifecycle-extensions: 2.2.0" et versions ultérieures, ViewModelProviders est obsolète, utilisez

viewModel = ViewModelProvider(this).get(BaseViewModel.class);

ou à Kotlin

viewModel = ViewModelProvider(this).get(BaseViewModel::class.java);

au lieu de

viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);
Mihai
la source
1

Fonctionne bien dans mon application (java) avant

loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory())
                .get(LoginViewModel.class);

changements à

loginViewModel = new ViewModelProvider(this,new LoginViewModelFactory()).get(LoginViewModel.class);

j'espère que ça pourrait aider

s wang
la source
1

Dans mon cas, je suis confronté au problème ci-dessous, à savoir:

** impossible d'accéder à androidx.lifecycle.a une fabrique de viewmodelprovider par défaut qui est une entrez la description de l'image icisous - classe de votre nom de classe, vérifiez le chemin de classe de votre module, vérifiez les dépendances en conflit de votre modèle **

J'ai ajouté ci-dessous les dépendances dans mon projet build.gradle .

def lifecycle_version = "2.2.0"

implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"

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

Ensuite, je crée ma classe dans un projet de module et je suis confronté à ce problème, puis j'ajoute ces bibliothèques dans le fichier module build.gradle et le problème est résolu.

Zeeshan Akhtar
la source
0

J'ai eu le même problème. Aucune des autres solutions ne m'a aidé.

J'ai réalisé que j'utilisais import androidx.lifecycle.ViewModelProvider;au lieu de import androidx.lifecycle.ViewModelProviders;.

Assurez-vous donc que vous utilisez import androidx.lifecycle.ViewModelProviders;. C'est ViewModelProvidersavec un s.

Sedrick
la source