0

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")
    }
}
Dan Harms
  • 4,501
  • 2
  • 17
  • 28
Saleem
  • 123
  • 1
  • 8
  • Yes, it does fix the problem. I wish error messages were better. Thanks for the help. I also had to add In build.gradle (module)in the plugins section id 'kotlin-kapt' In build.gradle (module)in the dependencies section implementation 'androidx.room:room-runtime:2.4.2' kapt "androidx.room:room-compiler:2.4.2" – Saleem Apr 23 '22 at 05:58

0 Answers0