Не удается создать экземпляр класса ViewModel, вызванный: java.lang.Исключение создания экземпляра: java.lang.Class .ViewModel не имеет конструктора с нулевым аргументом

#android #android-fragments #viewmodel

Вопрос:

Вот мой класс ViewModel

 import android.content.Context
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

 class ViewModel (private val context: Context) : ViewModel() {

    private var leadslist = MutableLiveData<Response>()

 init {
        val Repository: Repository by lazy {
            Repository
        }
            leadslist = Repository.getMutableLiveData(context)

    }

    fun getLeadsList(): MutableLiveData<Response> {
        return leadslist

    }
}

 

Вот как я называю это в своем Фрагменте.

 viewmodel = ViewModelProvider(requireActivity()).get(ViewModel::class.java)

 

Я знаю, что уже есть другие ответы, но, похоже, ничего не работает. Пожалуйста, помогите. Застрял на этом довольно долго.

Я тоже пробовал ViewModelFactory.

 ViewModelProvider(requireActivity(),ViewModelFactory(requireActivity())).get(ViewModel::class.java)
 

и использовал этот код для класса ViewModelFactory

 import android.content.Context
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

 class ViewModelFactory(private val context: Context) : ViewModelProvider.NewInstanceFactory() {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return ViewModel(context) as T
    }

}

 

и все же это не работает.

Затем я попробовал это

 viewmodel= ViewModelProvider.AndroidViewModelFactory(requireActivity().application)
      .create(ViewModel::class.java)
 

и это снова не сработало.

И как создать этот конструктор с нулевым аргументом в моей модели представления. И почему я не могу создать экземпляр.

Кроме того, с помощью одного из подходов я смог скомпилировать и запустить, но в этом случае функция viewmodel.observe не выполнялась.

Пожалуйста, помогите. Спасибо.

Комментарии:

1. Расширьте свой класс AndroidViewModel -в этот момент вам больше не понадобится специальная фабрика. Я также рекомендую назвать его как-то иначе, чем ViewModel .

2. Просто попробовал. Он работает без ошибок. Но он не выполняет ViewModel.observe , поэтому я не могу добавлять значения в свой адаптер из-за этого.

3. Я не знаю, что такое «это» в «это не выполняется». Вы можете увидеть примеры AndroidViewModel использования здесь , здесь и здесь .

Ответ №1:

Параметр context должен быть инициализирован.

Нравится:

 class ViewModel (private val context: Context = requireActivity().application) : ViewModel()