Nie można rozpoznać symbolu ViewModelProviders w AppCompatActivity


122

Hej, próbuję uruchomić mój ViewModel, ale na razie nie mam szczęścia. Android Studio wyświetla błąd Cannot resolve symbol 'ViewModelProviders'.

Każde inne pytanie znalazłem na ten temat została sprostowanie extends Activitydo extends AppCompatActivity, ale ja rozszerzenie właściwy. Nie wiem, czego mi brakuje ...
Mój kod jest oparty na tym filmie 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
„Nie można rozwiązać symbolu” oznacza, że ​​albo nie masz importinstrukcji, albo masz, ale nie masz zależności w konfiguracji Gradle.
CommonsWare,

9
Sprawdź czy masz dependecy dla android.arch.lifecycle: Rozszerzenia w build.gradle
Muthukrishnan Rajendran

Albo używa jakiejś biblioteki i dodał zależność w pliku gradle, aby mógł importować ViewModel, albo ma własną klasę ViewModelw innym pakiecie i importuje ją stamtąd
Akshay Katariya

Nie miał rozszerzeń jako zależności. Dzięki @MuthukrishnanRajendran
Sheler

Odpowiedzi:


203

W mojej kompilacji nie miałem obu zależności, stąd problem.

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

Dzięki @Muthukrishnan Rajendran


7
@Sheler Twoja odpowiedź jest poprawna, ale dokumentacja jest błędna. W dokumentacji określono, że ViewModel i LiveDat są w trakcie implementacji „android.arch.lifecycle: rozszerzenia: 1.1.1”
Pritish

2
Hmm, to rozwiązanie nadal nie rozwiązało mojego problemu. Mam implementację „android.arch.lifecycle: extensions: 1.1.1” w mojej aplikacji Gradle i wszystkich projektach {repozytoria {google () jcenter ()}} Czy jest jeszcze coś, co należy dodać?
musterjunk

1
Widzę klasę ViewModelProvider, ale nie ma ona metody .of (). ViewModelProviders nadal nie jest zdefiniowana. Jestem na Macu, jeśli to ma znaczenie.
musterjunk

Czy istnieje definicja min sdk lub java 8, którą należy dodać do projektu?
musterjunk

Nieważne. Upewnij się, że synchronizujesz pliki Gradles, jeśli się nie pojawiają.
musterjunk

96

Jeśli używasz androidx, potrzebujesz tego:

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

Dla każdego, kto ma ten problem, potrzebujesz również tego w gradle aplikacji: zastosuj wtyczkę: 'androidx.navigation.safeargs' i to w swoim android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Jeśli masz problem z tym, gdzie umieścić te rzeczy, zajrzyj do aplikacji demonstracyjnej Android-Sunflower od Google.
findusl

1
sprawdź ten link, aby uzyskać najnowszą wersję Androidax developer.android.com/jetpack/androidx/migrate
user2301281

Co za głupota! ViewModelProvider jest dostępny bez zależności, ale w przypadku ViewModelProviders potrzebujemy dodatkowej zależności.
Rahul Rastogi

15

Jeśli używasz skompilowanego sdk w wersji 28 lub nowszej, wystarczy dodać tylko jedną zależność, aby pobrać ViewModeliLiveData

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

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

Aby poznać najnowszą wersję android.arch.lifecycle:extensionsmożna szukać extensionsw maven.google.com/web/index.html i zobaczyć najnowszą wersję
Sanjeev

11

android.arch.lifecycle: rozszerzenia są przestarzałe

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

Utwórz instancję viewmodel w następujący sposób:

Jawa

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

Kotlin

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

5

powinieneś dodać bibliotekę do pliku build.gradle twojego projektu

def lifecycle_version = "2.0.0"

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


5

W moim przypadku (Android Studio 3.6.3), AppCompatActivityaby pomyślnie wykonać:

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

potrzebne są zarówno:

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

(sam z lifecycle-extentionsnie był wystarczający)


3

W pliku build.gradle dodaj te wiersze w bloku zależności

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

Przykładowy obraz pliku build.gradle


2

Korzystaj z androixbibliotek

Zmiana

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

do

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

Możesz użyć

Refactor>Migrate to AndroidX

2

W implementacji „androidx.lifecycle: lifecycle-extensions: 2.2.0” i nowsze wersje ViewModelProviders są przestarzałe, użyj

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

lub w Kotlinie

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

zamiast

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


1

Wcześniej działa dobrze w mojej aplikacji (java)

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

zmiany w

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

mam nadzieję, że to pomoże


1

W moim przypadku mam do czynienia z poniższym problemem tj .:

** nie ma dostępu do androidx.lifecycle. ma domyślną fabrykę viewmodelprovider, która jest wprowadź opis obrazu tutajpodklasą twojej klasy Nazwa, sprawdź swoją ścieżkę klasy modułu sprawdź konfliktowe zależności modelu **

Dodałem poniżej zależności w moim projekcie build.gradle .

def lifecycle_version = "2.2.0"

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

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

Następnie tworzę swoją klasę w projekcie modułu i mam do czynienia z tym problemem, następnie dodaję te biblioteki w pliku module build.gradle i problem został rozwiązany.


0

Miałem ten sam problem. Żadne inne rozwiązanie mi nie pomogło.

Zdałem sobie sprawę, że używam import androidx.lifecycle.ViewModelProvider;zamiast import androidx.lifecycle.ViewModelProviders;.

Więc upewnij się, że używasz import androidx.lifecycle.ViewModelProviders;. To jest ViewModelProvidersz s.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.