Глядя на документы Google для ViewModel
, они показывают приведенный ниже пример кода о том, как получить ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
При использовании последней зависимости android.arch.lifecycle:extensions:1.1.1
такого класса нет ViewModelProviders
.
Переходя к документации для ViewModelProviders
, я увидел комментарий:
Этот класс объявлен устаревшим на уровне API 1.1.0. Используйте ViewModelProvider.AndroidViewModelFactory
Проблема в том, что при попытке использования ViewModelProvider.AndroidViewModelFactory
не удается найти эквивалентный of
метод для получения экземпляра ViewModel
.
Что я пытался сделать:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
Отсюда и название метода create
, я получаю новый экземпляр ViewModel каждый раз, когда я его вызываю, но это не то, что мне нужно.
Есть идеи, что такое замена устаревшего кода выше?
Ответы:
ОБНОВЛЕНИЕ 2020-06-16 : В настоящее время
ViewModelProviders
устарела и больше не должна использоваться. Этот вопрос и ответ были сделаны в конце 2018 года, когда это было не так. Этот вопрос и ответ также относятся к более старой версии компонентов архитектурыViewModelProviders
, а не к версии AndroidX.Да, есть. Чтобы продемонстрировать это:
Создать новый проект в Android Studio 3.2.1 (с Kotlin,
minSdkVersion
21, шаблон «пустая активность»)Добавьте
android.arch.lifecycle:extensions:1.1.1
к зависимостямapp
модуляЭто даст вам
app/build.gradle
подобное:Затем вы увидите, что библиотека отображается во «Внешних библиотеках» с этим классом:
И вы сможете сослаться на этот класс:
Этот комментарий находится под
ViewModelProviders.DefaultFactory
записью класса и относится к этому классу, а неViewModelProviders
:Использование
ViewModelProviders
.источник
ViewModelProviders.of()
больше не существует.Я использую
2.2.0
версию Lifecycle-Extension :Надо работать, используя
ViewModelProvider
конструктор.2020/5/15 Обновление
Я нахожу другой элегантный способ достичь, Android KTX может помочь
Ссылка: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels
2020/06/25: исправлено дело делегата
источник
YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);
TextView
илиEditText
и представит новый Компонент.Как упомянул @FantasyFang в своем ответе, используйте самую последнюю версию,
lifecycle:lifecycle-extensions
которая в данный момент является2.2.0-alpha03
. Поэтому вы должны добавить в свой файл build.gradle следующую строку:Для тех, кто использует Java, чтобы решить эту проблему, передайте эти аргументы непосредственно конструктору ViewModelProvider :
Или, если вы не используете фабрику, просто используйте:
Не передавая ваш заводской объект.
источник
По состоянию на 2.2.0. расширения жизненного цикла устарели. Обратитесь к документации Google .
Это вырезка из страницы:
Новые библиотеки:
Новый код для JAVA:
Или для Котлина:
источник
Устарело с:
ViewModelProviders.of(this, provider).get(VM::class.java)
Для того, чтобы:
ViewModelProvider(this, provider).get(VM::class.java)
источник
В начале 2020 года Google исключил класс ViewModelProviders в версии 2.2.0 библиотеки жизненного цикла androidx.
Больше нет необходимости использовать ViewModelProviders для создания экземпляра ViewModel, вместо этого вы можете передать свой фрагмент или экземпляр Activity в конструктор ViewModelProvider.
Если вы используете такой код:
вы получите предупреждение о том, что ViewModelProviders устарел.
Чтобы избежать использования устаревших библиотек, внесите следующие изменения:
В файле build.gradle (Module: app) используйте версию 2.2.0 компонентов жизненного цикла:
Если вы хотите вместо этого использовать ViewModel из фрагмента, используйте
fragment-ktx автоматически включает activity-ktx, поэтому вам не нужно указывать оба в зависимостях.
В разделе android нужно указать Java 8:
В вашем фрагменте или действии измените импорт на:
импортировать androidx.activity.viewModels
Код для создания ViewModel становится таким:
вместо того
Используйте объект viewModel как:
где newNumer - объект LiveData
Во фрагменте, которым вы хотите поделиться ViewModel Activity, вы должны использовать
Это эквивалент передачи экземпляра Activity в (устаревшей)
ViewModelProviders.of()
функции.источник
ViewModelProviders.of () устарел.
Используйте конструкторы ViewModelProvider напрямую, поскольку они теперь обрабатывают роль ViewModelProvider.Factory по умолчанию.
источник
Да @Tarek, он устарел. Используйте сейчас с AndroidX:
источник
ViewModelProvider(viewModelStoreOwner, factory).get(YourVideoModel::class.java)
иначе вашonCleared()
код не будет работать правильно, и ViewModel не будет сохраняться при изменении конфигурации. Не используйте этот ответ.Вероятно, вы можете просто использовать:
без необходимости добавлять
android.arch.lifecycle:extensions:1.1.1
в качестве зависимости.источник
Используйте ViewModelProvider напрямую вместо пользователя ViewModelProviders.of (), как указано в документации.
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
источник
Я использую
android X
и тоже имел эту проблему.Прежде всего , вы должны добавить эти зависимости в свой
Gradle
:В моем случае $ lifecycle_version был
2.2.0-rc02
Во-вторых: импорт
ViewModelProvider
должен быть:Затем вы можете инициализировать vIewModel, как в примерах ниже:
источник
androidx.lifecycle:lifecycle-compiler
устаревшимandroidx.lifecycle:lifecycle-common-java8
.Собственно, что делает
ViewModelProviders.of()
метод под капотом?Он принимает
Fragment
в качестве аргумента, создаетViewModelProvider
объект и передает фрагмент непосредственноViewModelProvider
конструктору.Мы можем использовать то же самое.
Например, до:
После:
источник
ViewModelProvider
есть конструктор, который ожидает как a, такViewModelStoreOwner
и aFactory
.Если вы используете Kotlin, вы можете использовать делегат свойства
viewModels()
следующим образом:Источник: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
источник
Я не эксперт, но у меня есть строка кода, которая решила мою проблему на Java. Надеюсь, это кому-нибудь поможет.
Как я уже сказал, я хотел бы предоставить более подробную информацию, но это устранило эту проблему для меня.
источник
onCleared()
не будет называться таким образом, и ваша ViewModel будет воссоздаваться каждый раз (не сохраняется для изменений конфигурации).viewModel = new ViewModelProvider(this).get(MyViewModel.class)
, Если выAndroidViewModel
не получили этоApplication
, значит, у вас несоответствие версий между жизненным циклом и действием / фрагментом.new ViewModelProvider.AndroidViewModelFactory(
вместоnew ViewModelProvider(
.Использовать это:
источник
Вместо этого вы можете использовать это:
«this» в скобках - владелец экземпляра YourViewModel.
источник
Это ответ для Java, но вы можете понять суть. Решение состоит в том, что вам нужно использовать ViewModelProvider, потому что ViewModelProviders устарел :
Пример использования:
Кроме того, не забудьте обновить зависимости Gradle : проверьте здесь их последние версии
!!! Однако будьте осторожны, потому что некоторые ответы рекомендуют это решение, но оно не сработало для меня:
Потому что, когда я использовал этот способ, я получил сообщение об ошибке ниже:
@canerkaseler
источник
create
, тоonCleared()
работать не будет.androidx.core
и вашимиandroidx.lifecycle
зависимостями.Когда вы используете кинжал, вы передадите factory в конструкторе
источник
Если у вас есть эта реализация
Попробуй использовать
viewModel = MainViewModel()
источник
Попробуй это...
источник
это должно работать так
источник