Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.RuntimeException: Cannot create an instance of class ViewModel, when android recreates Activity and Fragment

Case is of Activity-Fragment Recreate : I am creating ViewModel from activity context at activity level and trying to access the initialised ViewModel at Fragment level, using ViewModelProvider.of().

Below code works in happy case; but when activity is recreated (changes system language or permission), same code don't work, and fragment is not able to access the activity created viewModel.

ViewModel is parameterised and has only one primary constructor and initialised using ViewModelProvider.Factory

ViewModel Structure

class MessageViewModel(var message: MutableLiveData<String>): ViewModel() { ... }

ViewModel Initialisation at Activity

val viewModel = ViewModelProviders.of(this, MessageVMFactory())
            .get(MessageViewModel::class.java)

Accessing ViewModel at Fragment

val viewModel = ViewModelProviders.of(activity)
            .get(MessageViewModel::class.java)

Error

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.krp.android.viewmodeldemo/com.krp.android.viewmodeldemo.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.krp.android.viewmodeldemo.utility.MessageViewModel

like image 304
Kumar Purushottam Avatar asked Dec 21 '25 19:12

Kumar Purushottam


1 Answers

If you have initialised the ViewModel via Factory, you must access it via Factory, regardless of any context. Seems ViewModel issue when system recreates activity or fragment.

It works fine at Fragment when

val viewModel = ViewModelProviders.of(activity, MessageVMFactory())
                .get(MessageViewModel::class.java)
like image 195
Kumar Purushottam Avatar answered Dec 23 '25 08:12

Kumar Purushottam