Как получить экземпляр ViewModel в действии в 2020 году? - PullRequest
3 голосов
/ 28 января 2020

Я новичок в модели mvvm. Я создал ViewModel для основной деятельности. Теперь я хочу получить экземпляр ViewModel в основной деятельности.

Большинство учебников и ответов здесь, в Stackoverflow, предлагают использовать ViewModelProviders.of(..., но это не рекомендуется.

Итак, в соответствии с этим вопросом о stackoverflow: ViewModelProviders устарела в 1.1.0 основное действие в onCreate, я делаю следующее (и могу поклясться, что он уже запущен): mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

Однако я получаю сообщение об ошибке, что подходящий конструктор не найден.

error: no suitable constructor found for ViewModelProvider(MainActivity)

В качестве альтернативы, чтобы прояснить, что MainActivity должен быть ViewModelStoreOwner, я создал переменную ViewModelStoreOwner vmso = this; и поместил эту переменную в конструктор следующим образом: mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);

Ответы [ 4 ]

3 голосов
/ 03 апреля 2020

Вы должны обновить свой файл Gradle:

внедрение 'androidx.lifecycle: lifecycle-extensions: 2.2.0'

И благодаря этому изменению вы можете передайте Activity указанному вами конструктору:

mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
0 голосов
/ 30 января 2020

Повторяющийся вопрос и уже здесь ответили

Просто замените:

Это:

boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)

На это:

boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)
0 голосов
/ 01 февраля 2020

На данный момент единственное, что работает для меня, это использовать: MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);

Однако я все еще благодарен за любой совет, как это можно сделать по-другому, используя new ViewModelProvider(this).get(MainActivityViewModel.class);

0 голосов
/ 28 января 2020

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

Android Версия библиотеки поддержки устарела. Поэтому вам нужно убедиться, что вы импортируете Androidx. И вам необходимо реализовать зависимость androidx в файле Gradle.

Не рекомендуется создавать новый объект ViewModel с ключевым словом "new".

...