App crashes when ViewModel is accessed, problem with ViewModel, ViewModel Factory. I have created an app that uses Navigation Draw Activity. Then I added a Login Fragment in it. App builds and starts OK. I can access all navigation menus (gallery, home, slideshow and login). For login fragment, I had to create a custom LoginViewModelFactory. I believe that is where my problem lies. When bring up Login fragment, it come up, but when make a call to a function (Login) in LoginViewModel, it crashes. I have spent a quite a bit of time debugging it, but I cannot figure out how to make it work properly (I should be able to enter username/email and password and them put data in RoomDb). Crash happens when I click a button in login fragment. I have created a sample app and placed it in GitHub. https://github.com/msyusuf/LoginFragNavActivity.git
Stack trace
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.yusuf.myapplication, PID: 6278
java.lang.ClassCastException: android.app.Application cannot be cast to com.yusuf.myapplication.LoginTestApplication
at com.yusuf.myapplication.ui.login.LoginFragment$loginViewModel$2.invoke(LoginFragment.kt:36)
at com.yusuf.myapplication.ui.login.LoginFragment$loginViewModel$2.invoke(LoginFragment.kt:35)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:42)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:31)
at com.yusuf.myapplication.ui.login.LoginFragment.getLoginViewModel(LoginFragment.kt:35)
at com.yusuf.myapplication.ui.login.LoginFragment.onViewCreated$lambda-0(LoginFragment.kt:124)
at com.yusuf.myapplication.ui.login.LoginFragment.$r8$lambda$qvj2qYOx8l9CdK1IxFuRWVyQOQE(Unknown Source:0)
at com.yusuf.myapplication.ui.login.LoginFragment$$ExternalSyntheticLambda0.onClick(Unknown Source:8)
at android.view.View.performClick(View.java:7792)
The error indicates that android.app.Application cannot be cast to com.yusuf.myapplication.LoginTestApplication
val loginViewModel: LoginViewModel by viewModels {
LoginViewModelFactory((activity?.application as LoginTestApplication).repository)
//return@viewModels LoginViewModelFactory((activity?.application as LoginTestApplication).repository)
class LoginViewModelFactory(private val repository: LoginRepository) :
ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(LoginViewModel::class.java))
{
return LoginViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}