Issue
After updating navigation
component and lifecycle viewmodel
version to 2.5.0-alpha01 I have got following issue.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.atcc.aewp/com.atcc.aewp.activity.SplashActivity}: java.lang.UnsupportedOperationException: SavedStateViewModelFactory constructed with empty constructor supports only calls to create(modelClass: Class, extras: CreationExtras).
Exception throws when view model is loaded
open class BaseActivity : AppCompatActivity() {
private val appLanguageViewModel: AppLanguageViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
appLanguageViewModel.result.observe(this) {
...
}
}
}
Here is my view model class
class AppLanguageViewModel : ViewModel() {
private val languageLiveData = MutableLiveData<Event<ApplicationLanguage>>()
val result: LiveData<Event<ApplicationLanguage>> = languageLiveData
fun setLanguage(applicationLanguage: ApplicationLanguage) {
if (LanguagePreferences.instance().setLanguage(applicationLanguage.name)) {
languageLiveData.postValue(Event(applicationLanguage))
}
}
}
Solution
Workaround;
private val viewModel: AppLanguageViewModel by viewModels {
SavedStateViewModelFactory(application, this)
}
Reason;
Because not everything uses the new API of ViewModelFactory, we get this crash. The default factory in ComponentActivity is SavedStateViewModelFactory without any constructor parameter.
We have an issue with HiltViewModelFactory. It calls create method without passing new CreationExtras values. I assume this should be fixed in hilt in our case. If you can share the rest of the stack trace, we might find out the root cause in your case too.
Answered By - Sinan Kozak
Answer Checked By - Dawn Plyler (JavaFixing Volunteer)