вьюмоделпровидерс(принадлежит артефакту Maven android.arch.lifecycle:extensions) — это класс из пакета android.arch.lifecycle, который содержит служебные методы для класса ViewModelStore и возвращает вам объект класса ViewModelProvider, когда вы используете из него метод of().
Таким образом, вы можете думать о нем как о оболочке класса библиотеки для ViewModelProvider.
С другой стороны, вьюмоделпровидер(принадлежит артефакту Maven android.arch.lifecycle:viewmodel) — это класс, предоставляющий ViewModels для области действия. Так что ViewModelProvider по умолчанию для Activity или Fragment можно получить из класса ViewModelProviders.
Так да ! это основной класс, который обеспечивает основную логику для вашего ViewModel, но вам нужно будет получить его от ViewModelProviders, который возвращает вам этот класс для получения ViewModel.
Редактировать:
После ВьюМодель версии 2.2.0:
Класс ViewModelProviders устарел, и теперь мы можем использовать ViewModelProvider напрямую, создав его новый экземпляр для получения ViewModel.
Что-то вроде этого: ViewModelProvider(this).get(SomeViewModel::class.java)
Какой API мы должны использовать тогда?
@IgorGanapolsky Если вы используете последнюю альфа-зависимость ViewModel, то этот API изменил то, как мы использовали для получения ViewModel из ViewModelProviders.
@JeelVankhede нужна ваша помощь здесь stackoverflow.com/questions/64421965/…
Это очень мило. Спасибо, бро :)
Класс ViewModelProviderS предоставляет экземпляры класса ViewModelProvider. Ваш вызов ViewModelProviders.of("this") создает и возвращает ViewModelProvider, связанный с действием.
ViewModelProvider, с другой стороны, предоставляет экземпляры ViewModel действия. Вызов ViewModelProviders.get(ExampleViewModel::class.java) возвращает экземпляр класса ExampleViewModel.
Эти функции обычно идут вместе, например:
ViewModelProviders.of("this").get(ExampleViewModel::class.java)
@andritK, кажется, ViewModelProviders устарела. В документах говорится, что мы можем сразу использовать ViewModelProviders в этом случае. тогда как насчет изменения приведенных ниже кодов на следующие: ОТ
inline fun <reified T : ViewModel> Fragment.viewModel(factory: ViewModelProvider.Factory, body: T.() -> Unit): T {
val vm = ViewModelProviders.of(this, factory)[T::class.java]
vm.body()
return vm
}
К
inline fun <reified T : ViewModel> Fragment.viewModel(factory: ViewModelProvider.Factory, body: T.() -> Unit): T {
val vm = ViewModelProvider(this, factory).get(T::class.java)
vm.body()
return vm
}
Does this work?
ViewModelProvidersустарел. ИспользуйтеViewModelProvider(this).get(YourViewModel::class.java).