Das Symbol ViewModelProviders in AppCompatActivity kann nicht aufgelöst werden


121

Hey, ich versuche mein ViewModel zum Laufen zu bringen, aber bisher kein Glück. Android Studio zeigt Fehler an Cannot resolve symbol 'ViewModelProviders'.

Jede andere Frage , die ich zu diesem Thema gefunden wurde Korrektur extends Activityan extends AppCompatActivity, aber ich bin die richtige erstreckt. Ich bin mir nicht sicher, was ich vermisse ...
Mein Code basiert auf diesem YouTube-Video

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;
}

1
"Symbol kann nicht aufgelöst werden" bedeutet, dass Sie entweder nicht über die importAnweisung verfügen oder dass Sie die Abhängigkeit in Ihrem Gradle-Setup nicht haben.
CommonsWare

9
Überprüfen Sie, ob Sie abhängig von android.arch.lifecycle sind: Erweiterungen in build.gradle
Muthukrishnan Rajendran

Entweder verwendet er eine Bibliothek und hat die Abhängigkeit in die Gradle-Datei eingefügt, damit er ViewModel importieren kann, oder er hat eine benutzerdefinierte Klasse ViewModelunter dem anderen Paket und importiert sie von dort
Akshay Katariya

Hatte keine Erweiterungen als Abhängigkeit. Danke @MuthukrishnanRajendran
Sheler

Antworten:


202

Ich hatte nicht beide Abhängigkeiten in meinem Build, daher das Problem.

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

Danke @Muthukrishnan Rajendran


7
@Sheler Ihre Antwort ist richtig, aber die Dokumente sind falsch. In der Dokumentation wird angegeben, dass ViewModel und LiveDat beide in der Implementierung "android.arch.lifecycle: extensions: 1.1.1" sind
Nudge

2
Hmm, diese Lösung hat mein Problem immer noch nicht gelöst. Ich habe die Implementierung 'android.arch.lifecycle: extensions: 1.1.1' in meinem App-Gradle und allprojects {repositories {google () jcenter ()}}. Muss noch etwas hinzugefügt werden?
Musterjunk

1
Ich sehe die ViewModelProvider-Klasse, aber sie hat nicht die .of () -Methode. ViewModelProviders ist noch nicht definiert. Ich bin auf einem Mac, wenn das wichtig ist.
Musterjunk

Gibt es eine min sdk- oder java 8-Definition, die dem Projekt hinzugefügt werden muss?
Musterjunk

Keine Ursache. Stellen Sie sicher, dass Sie Ihre Gradles-Dateien synchronisieren, wenn sie nicht angezeigt werden.
Musterjunk

95

Wenn Sie verwenden androidx, benötigen Sie Folgendes:

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

Für alle anderen, die dieses Problem haben, benötigen Sie dies auch in Ihrem App-Gradle: Plugin anwenden: 'androidx.navigation.safeargs' und dies in Ihrem Android-Gradle: Klassenpfad "android.arch.navigation: Navigation-Safe-Args-Gradle-Plugin : 1.0.0-alpha06 "Wenn Sie Probleme haben, diese Dinge zu platzieren, schauen Sie in der Android-Sonnenblumen-Demo-App von Google nach.
Findusl

1
Überprüfen Sie diesen Link für die neueste AndroidX-Version developer.android.com/jetpack/androidx/migrate
user2301281

Was ist die Dummheit! ViewModelProvider ist ohne Abhängigkeit verfügbar, aber für ViewModelProvider benötigen wir eine zusätzliche Abhängigkeit.
Rahul Rastogi

15

Wenn Sie kompilierte SDK-Version 28 oder höher verwenden, müssen Sie nur eine einzige Abhängigkeit hinzufügen, um ViewModelund zu erhaltenLiveData

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

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}

Um die neueste Version von zu erfahren android.arch.lifecycle:extensions, können Sie extensionsin maven.google.com/web/index.html suchen und die neueste Version sehen
Sanjeev

11

android.arch.lifecycle: Erweiterungen sind veraltete Verwendung

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

Erstellen Sie eine Instanz des Ansichtsmodells wie folgt:

Java

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

Kotlin

var obj = ViewModelProvider(context).get(ClassViewModel::class.java)

5

Sie sollten eine Bibliothek im build.gradle Ihres Projekts hinzufügen

def lifecycle_version = "2.0.0"

// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

5

Ich löse dieses Problem aus der offiziellen Android-Dokumentation . Fügen Sie unten hinzubuild.grale

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

5

In meinem Fall (Android Studio 3.6.3), AppCompatActivityum erfolgreich zu tun:

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

es wird beides benötigt von:

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

(allein mit lifecycle-extentionswar nicht ausreichend)


3

Fügen Sie in der Datei build.gradle diese Zeilen im Abhängigkeitsblock hinzu

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"
...
}

Beispielbild der Datei build.gradle


2

Verwenden Sie androixBibliotheken

Veränderung

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

zu

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

Sie können verwenden

Refactor>Migrate to AndroidX

2

In der Implementierung "androidx.lifecycle: Lifecycle-Extensions: 2.2.0" und höher ist ViewModelProviders veraltet

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

oder in Kotlin

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

anstatt

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


1

Funktioniert gut in meiner App (Java) vor

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

ändert sich zu

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

hoffe es könnte helfen


1

In meinem Fall stehe ich vor dem folgenden Problem:

** kann nicht auf androidx.lifecycle zugreifen. Hat eine Standard-Viewmodelprovider-Factory, die eine Geben Sie hier die Bildbeschreibung einUnterklasse Ihres Klassennamens ist. Überprüfen Sie Ihren Modulklassenpfad. Überprüfen Sie die Abhängigkeiten Ihres Modells. **

Ich habe unten Abhängigkeiten in meinem Projekt build.gradle hinzugefügt .

def lifecycle_version = "2.2.0"

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

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

Dann erstelle ich meine Klasse in einem Modulprojekt und stelle dieses Problem fest. Dann füge ich diese Bibliotheken in die Datei module build.gradle ein und das Problem ist behoben.


0

Ich hatte das gleiche Problem. Keine der anderen Lösungen hat mir geholfen.

Mir wurde klar, dass ich import androidx.lifecycle.ViewModelProvider;statt benutzte import androidx.lifecycle.ViewModelProviders;.

Stellen Sie also sicher, dass Sie verwenden import androidx.lifecycle.ViewModelProviders;. Das ist ViewModelProvidersmit einem s.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.