Impossibile risolvere il simbolo ViewModelProviders su AppCompatActivity


122

Ehi, sto cercando di far funzionare il mio ViewModel, ma finora non ho avuto fortuna. Android Studio mostra un errore Cannot resolve symbol 'ViewModelProviders'.

Ogni altra domanda che ho trovato su questo argomento stava correggendo extends Activityper extends AppCompatActivity, ma sto estendendo quella giusta. Non sono sicuro di cosa mi manchi ... Il
mio codice è basato su questo video di 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;
}

1
"Impossibile risolvere il simbolo" significa che o non si dispone importdell'istruzione, oppure lo si ha ma non si ha la dipendenza nella configurazione di Gradle.
CommonsWare

9
Controlla se hai dipendenza per android.arch.lifecycle: estensioni in build.gradle
Muthukrishnan Rajendran

O sta usando una libreria e ha aggiunto la dipendenza nel file gradle in modo da poter importare ViewModel o ha una classe personalizzata ViewModelsotto il pacchetto diverso e la sta importando da lì
Akshay Katariya

Non aveva estensioni come dipendenza. Grazie @MuthukrishnanRajendran
Sheler

Risposte:


203

Non avevo entrambe le dipendenze nella mia build, da qui il problema.

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

Grazie @Muthukrishnan Rajendran


7
@Sheler La tua risposta è corretta ma i documenti sono sbagliati. Nella documentazione si specifica che ViewModel e LiveDat sono entrambi in implementazione "android.arch.lifecycle: extensions: 1.1.1"
Pritish

2
Hmm questa soluzione non ha ancora risolto il mio problema. Ho l'implementazione 'android.arch.lifecycle: extensions: 1.1.1' nella mia app gradle e allprojects {repository {google () jcenter ()}} C'è qualcos'altro che deve essere aggiunto?
musterjunk

1
Vedo la classe ViewModelProvider ma non ha il metodo .of (). ViewModelProviders non è ancora definito. Sono su un Mac se questo è importante.
musterjunk

C'è una definizione min sdk o java 8 che deve essere aggiunta al progetto?
musterjunk

Non importa. Assicurati di sincronizzare i tuoi file gradles se non viene visualizzato.
musterjunk

96

Se stai usando androidxhai bisogno di questo:

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

Per chiunque altro abbia questo problema, è necessario anche questo nella tua app gradle: apply plugin: 'androidx.navigation.safeargs' e questo nel tuo android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Se hai problemi a dove mettere queste cose, guarda nell'app demo android-sunflower di Google.
findusl

1
controlla questo link per l'ultima versione di androidx developer.android.com/jetpack/androidx/migrate
user2301281

Qual è la stupidità! ViewModelProvider è disponibile senza dipendenza, ma per ViewModelProvider abbiamo bisogno di una dipendenza extra.
Rahul Rastogi

15

Se stai usando la versione SDK compilata 28 o successiva, devi solo aggiungere una singola dipendenza per ottenere ViewModeleLiveData

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

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

Per conoscere l'ultima versione di android.arch.lifecycle:extensionspuoi cercare extensionsin maven.google.com/web/index.html e vedere l'ultima versione
Sanjeev

11

android.arch.lifecycle: le estensioni sono un uso deprecato

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

Crea istanza di viewmodel in questo modo:

Giava

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

Kotlin

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

5

dovresti aggiungere la libreria nel file build.gradle del tuo progetto

def lifecycle_version = "2.0.0"

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

5

Risolvo questo problema dalla documentazione ufficiale di Android . Aggiungi sotto abuild.grale

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

5

Nel mio caso (Android Studio 3.6.3), AppCompatActivityper fare con successo:

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

è necessario entrambi:

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

(da solo con lifecycle-extentionsnon era sufficiente)


3

Nel file build.gradle, aggiungi queste righe nel blocco delle dipendenze

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

Immagine di esempio del file build.gradle


2

Usa le androixbiblioteche

Modificare

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

per

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

Puoi usare

Refactor>Migrate to AndroidX

2

Nell'implementazione "androidx.lifecycle: lifecycle-extensions: 2.2.0" e versioni successive ViewModelProviders è deprecato, utilizzare

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

oa Kotlin

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

invece di

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


1

Funziona bene nella mia app (java) prima

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

cambia in

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

spero che possa aiutare


1

Nel mio caso, sto affrontando il problema seguente, ad esempio:

** non è possibile accedere ad androidx.lifecycle.ha una factory viewmodelprovider predefinita che è una inserisci qui la descrizione dell'immaginesottoclasse del nome della classe, controlla il percorso di classe del modulo controlla le dipendenze in conflitto del tuo modello **

Ho aggiunto sotto le dipendenze nel mio progetto build.gradle .

def lifecycle_version = "2.2.0"

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

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

Quindi creo la mia classe in un progetto di modulo e sto affrontando questo problema, quindi aggiungo queste librerie nel file build.gradle del modulo e il problema è risolto.


0

Ho avuto lo stesso problema. Nessuna delle altre soluzioni mi ha aiutato.

Ho capito che stavo usando import androidx.lifecycle.ViewModelProvider;invece di import androidx.lifecycle.ViewModelProviders;.

Quindi assicurati di utilizzare import androidx.lifecycle.ViewModelProviders;. Questo è ViewModelProviderscon un file s.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.