#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()