Неможливо вирішити символ ViewModelProviders на AppCompatActivity


122

Гей, я намагаюся працювати, щоб моя ViewModel працювала, але поки не пощастило. Android Studio показує помилку Cannot resolve symbol 'ViewModelProviders'.

Будь-який інший питання , який я знайшов на цю тему виправляв extends Activityдо extends AppCompatActivity, але я тягнеться правильний. Не впевнений, чого мені не вистачає ...
Мій код заснований на цьому відео 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
"Неможливо вирішити символ" означає, що або у вас немає importзаяви, або у вас є, але у вас немає залежності в налаштуваннях Gradle.
— CommonsWare

9
Перевірте, чи є у вас залежність від android.arch.lifecycle: розширення в build.gradle
— Muthukrishnan Rajendran

Або він використовує якусь бібліотеку і додав залежність у файл gradle, щоб він міг імпортувати ViewModel, або у нього є спеціальний клас ViewModelпід іншим пакетом, і він імпортує його звідти
— Akshay Katariya,

Не було розширень як залежності. Дякуємо @MuthukrishnanRajendran
— Sheler

Відповіді:


203

У мене не було обох залежностей у моєму складі, звідси і проблема.

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

Дякую @Muthukrishnan Rajendran


7
@Sheler Ви відповіли правильно, але документи неправильні. У документації зазначено, що обидва ViewModel та LiveDat реалізуються "android.arch.lifecycle: розширення: 1.1.1"
— Pritish

2
Хм, це рішення досі не вирішило мого питання. У мене є реалізація 'android.arch.lifecycle: extensions: 1.1.1' у своєму додатку gradle та allprojects {repositories {google () jcenter ()}} Чи потрібно ще щось додати?
— musterjunk

1
Я бачу клас ViewModelProvider, але він не має методу .of (). ViewModelProviders все ще не визначений. Я на Mac, якщо це має значення.
— musterjunk

Чи є визначення min sdk або java 8, яке потрібно додати до проекту?
— musterjunk

Не звертай уваги. Переконайтеся, що ви синхронізуєте файли gradles, якщо вони не відображаються.
— musterjunk

96

Якщо ви користуєтесь, androidxвам це потрібно:

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

Для всіх, хто має цю проблему, вам також потрібно це у своєму додатку gradle: застосуйте плагін: 'androidx.navigation.safeargs', і це у вашому андроїд gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Якщо у вас виникли проблеми, де їх помістити, подивіться у демонстраційному додатку android-sunflower від google.
— findusl

1
перевірте це посилання на останню версію для androidx версії developer.android.com/jetpack/androidx/migrate
— user2301281

Яка дурість! ViewModelProvider доступний без залежності, але для ViewModelProviders нам потрібна додаткова залежність.
— Рахул Растогі

15

Якщо ви використовуєте компільований sdk версії 28 або новішої, вам потрібно лише додати одну залежність, щоб отримати ViewModelіLiveData

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

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

Щоб дізнатися , останню версію android.arch.lifecycle:extensionsви можете знайти extensionsв maven.google.com/web/index.html і подивитися останню версію
— Санджив

11

android.arch.lifecycle: розширення не використовується

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

Створіть такий екземпляр viewmodel:

Java

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

Котлін

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

5

ви повинні додати бібліотеку в build.gradle проекту

def lifecycle_version = "2.0.0"

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


5

У моєму випадку (Android Studio 3.6.3), AppCompatActivityщоб успішно зробити:

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

це потрібно обом:

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

(однієї з lifecycle-extentionsне було достатньо)


3

У файл build.gradle додайте ці рядки до блоку залежностей

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

Зразок зображення файлу build.gradle


2

Використовуйте androixбібліотеки

Зміна

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

до

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

Можна використовувати

Refactor>Migrate to AndroidX

2

У реалізації "androidx.lifecycle: розширення життєвого циклу: 2.2.0" та новіші версії ViewModelProviders застаріли, використовуйте

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

або в Котліні

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

замість

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


1

Раніше працює в моєму додатку (Java)

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

зміни до

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

сподіваюся, що це може допомогти


1

У моєму випадку я стикаюся з нижчим питанням, тобто:

** не може отримати доступ до androidx.lifecycle. має заводський перегляд моделей провідника за замовчуванням, який є введіть тут опис зображенняпідкласом імені вашого класу, перевірте класний шлях модуля, щоб перевірити модель, яка суперечить залежностям **

Я додав нижче залежності в своєму проекті build.gradle .

def lifecycle_version = "2.2.0"

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

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

Потім я створюю свій клас у проекті модуля, і я стикаюся з цією проблемою, потім додаю ці бібліотеки у файл build.gradle файл модуля і проблема вирішується.


0

У мене була така ж проблема. Жодне з інших рішень мені не допомогло.

Я зрозумів, що використовую import androidx.lifecycle.ViewModelProvider;замість цього import androidx.lifecycle.ViewModelProviders;.

Тому переконайтеся, що ви використовуєте import androidx.lifecycle.ViewModelProviders;. Тобто ViewModelProvidersз s.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.