Не удается разрешить символ 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'
Babao
источник
Для всех, у кого есть эта проблема, вам также понадобится это в вашем приложении 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);

надеюсь, это может помочь

s wang
источник
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.

Sedrick
источник