I want to implement Hilt to my android app but the app keep crashing

83 Views Asked by At

I am writing an android app with kotlin and I am trying to implement Firebase authentication. I am using Hilt for it, however I keep getting errors that I do not know how to fix. The app keeps crashing and from the logcat I know that the error is related to the ViewModel.

FATAL EXCEPTION: main
Process: com.example.mp_draft10, PID: 3832
java.lang.RuntimeException: Cannot create an instance of class com.example.mp_draft10.auth.SignUpViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:320)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:302)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:276)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128)
    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:173)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:150)
    at androidx.lifecycle.viewmodel.compose.ViewModelKt.get(ViewModel.kt:215)
    at androidx.lifecycle.viewmodel.compose.ViewModelKt.viewModel(ViewModel.kt:156)
    at com.example.mp_draft10.auth.SignUpScreenKt.SignUpScreen(SignUpScreen.kt:103)
    at com.example.mp_draft10.ComposableSingletons$MainActivityKt$lambda-5$1.invoke(MainActivity.kt:94)
    at com.example.mp_draft10.ComposableSingletons$MainActivityKt$lambda-5$1.invoke(MainActivity.kt:93)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.navigation.compose.NavHostKt$NavHost$14$1.invoke(NavHost.kt:308)
    at androidx.navigation.compose.NavHostKt$NavHost$14$1.invoke(NavHost.kt:306)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248)
    at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
    at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65)
    at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
    at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52)
    at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
    at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
    at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:306)
    at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:295)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:755)
    at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:744)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:818)
    at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:726)
    at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:709)

here is the class that the error appears to be related to

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.mp_draft10.auth.util.Resource
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
class SignUpViewModel @Inject constructor(
    private val repository: AuthRepository
): ViewModel() {

    val _signUpState = Channel<SignInState>()
    val signUpState = _signUpState.receiveAsFlow()

    fun registerUser(email: String, password: String) = viewModelScope.launch {
        repository.loginUser(email,password).collect{result ->
            when(result){
                is Resource.Success ->{
                    _signUpState.send(SignInState(isSuccess = "Sign in success"))
                }
                is Resource.Loading ->{
                    _signUpState.send(SignInState(isLoading = true))
                }
                is Resource.Error ->{
                    _signUpState.send(SignInState(isError = result.message))
                }
            }
        }
    }
}
3

There are 3 best solutions below

0
Leviathan On

As described in https://developer.android.com/training/dependency-injection/hilt-android#android-classes, Hilt can provide you with the view model, if you annotate it with @HiltViewModel. That annoation seems to be missing in your code, what probably is the cause for the error you experience.

0
Botir On

Annotate your view model with @HiltViewModel annotation, then it should work

0
Dayem Saeed On

You are missing the @HiltViewModel annotation in your code. It should be above the class declaration i.e directly above the class SignUpViewModel line and after the imports. Please refer to this for an idea of how to annotate viewmodels correctly: https://developer.android.com/training/dependency-injection/hilt-jetpack#viewmodels