Не удается разрешить символ 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: extensions в build.gradle
Раджендран

Либо он использует какую-то библиотеку и добавил зависимость в файл Gradle, чтобы он мог импортировать ViewModel, либо у него есть собственный класс ViewModelв другом пакете, и он импортирует его оттуда
Акшай Катария

Не было расширений как зависимости. Благодаря @MuthukrishnanRajendran
Шелер

Ответы:


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: extensions: 1.1.1»
Притиш

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

Неважно. Убедитесь, что вы синхронизируете файлы градиентов, если они не отображаются.
musterjunk

96

Если вы используете, androidxвам нужно это:

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

Для всех, у кого есть эта проблема, вам также понадобится это в вашем приложении gradle: apply plugin: 'androidx.navigation.safeargs' и это в вашем android 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 доступен без зависимости, но для ViewModelProvider нам нужна дополнительная зависимость.
Рахул Растоги

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 и увидеть последнюю версию
Санджив,

12

android.arch.lifecycle: использование расширений не рекомендуется

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

Создайте экземпляр модели просмотра следующим образом:

Ява

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: lifecycle-extensions: 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. имеет фабрику viewmodelprovider по умолчанию, которая является введите описание изображения здесьподклассом вашего имени класса, проверьте путь к классу вашего модуля, проверьте конфликтующие зависимости вашей модели **

Я добавил ниже зависимости в свой проект 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.