Неможливо вирішити символ 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.