Не удается разрешить символ 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.