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;
}
Sheler
źródło
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

Sheler
źródło
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'
Babao
źródło
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"
}
Sanjeev
źródło
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)
Sumit Shukla
źródło
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"
Fatih Çakıroğlu
źródło
5

Rozwiązuję ten problem z oficjalnej dokumentacji Androida . Dodaj poniżej dobuild.grale

def lifecycle_version = "2.0.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
shellhub
źródło
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)

hata
źródło
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

Sulav Timsina
źródło
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
Sebastian Duran
źródło
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);
Mihai
źródło
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

s wang
źródło
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.

Zeeshan Akhtar
źródło
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.

Sedrick
źródło