Как создать экземпляр ViewModel, который расширяет AndroidViewModel?

#android #kotlin #mvvm #abstract-class #instantiation

#Android #kotlin #mvvm #абстрактный класс #создание экземпляра

Вопрос:

Я следую руководству, в котором ViewModel расширяет абстрактный класс для использования сопрограмм, это класс, который расширяет:

 abstract class BaseViewModel(application: Application) : AndroidViewModel(application), CoroutineScope {
private val job =  Job()

override val coroutineContext: CoroutineContext
    get() = job   Dispatchers.Main

override fun onCleared() {
    super.onCleared()
    job.cancel()
}}
 

И это ViewModel:

 class ViewModel(application: Application) : BaseViewModel(application) {}
 

Итак, в MainActivity я пытаюсь создать экземпляр класса следующим образом:

     override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel = ViewModelProvider(this)[ViewModel::class.java]}
 

В руководстве парень отлично это делает, но когда я пытаюсь запустить приложение, оно выдает мне исключение:

  Caused by: java.lang.RuntimeException: Cannot create an instance of class com.name.nameapp.main.viewmodel.ViewModel
 

Я чувствую, что мне чего-то не хватает, можете ли вы, ребята, указать, что это такое, если вам нужна дополнительная информация, я с удовольствием ее опубликую

Ответ №1:

Ваш ViewModel дочерний AndroidViewModel элемент, для которого требуется Application объект. Итак, вам нужно будет предоставить Factory класс для создания экземпляра ViewModel . Вот так:

 val viewModelProvider = ViewModelProvider(
     this, 
     ViewModelProvider.AndroidViewModelFactory(application)
)
viewModel = viewModelProvider[MainViewModel::class.java]
 

Если вы используете библиотеку фрагментов из Jetpack

 implementation "androidx.fragment:fragment-ktx:1.2.5"
 

Вы можете использовать делегирование свойств следующим образом:

 val viewModel: ViewModel by viewModels()