Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot create an instance of viewmodel while using Jetpack Compose navigation

I am using navigation component for jetpack compose in my app like this:

@Composable
fun FoodiumNavigation() {
    val navController = rememberNavController()

    NavHost(
        navController = navController,
        startDestination = Screen.Main.route,
    ) {
        composable(Screen.Main.route) {
            MainScreen(navController)
        }

        ...
    }
}

And I am getting viewmodel in my MainScreen composable like this:

@Composable
fun MainScreen(navController: NavController) {
    val mainViewModel: MainViewModel = viewModel()
    ...
}

which is giving me a runtime exception as Cannot create an instance of class com.package.main.MainViewModel.

Here, I am stating that this only happens while using navigation component, i.e. everything was working fine and mainViewModel was successfully instantiated before using navigation component in my app.

The MainViewModel is like this:

@ExperimentalCoroutinesApi
@HiltViewModel
class MainViewModel @Inject constructor(private val postRepository: PostRepository) :
    ViewModel() {

    private val _postsLiveDataState = MutableLiveData<UiState<List<Post>>>()
    val postLiveState: LiveData<UiState<List<Post>>> = _postsLiveDataState

    init {
        getPostsState()
    }

    private fun getPostsState() {
        viewModelScope.launch {
            postRepository.getAllPosts()
                .onStart { _postsLiveDataState.value = UiState(loading = true) }
                .map { resource -> UiState.fromResource(resource) }
                .collect { state -> _postsLiveDataState.value = state }
        }
    }
}
like image 273
Vivek Singh Avatar asked Jan 20 '21 13:01

Vivek Singh


2 Answers

If your @HiltViewModel is scoped to the navigation graph use hiltNavGraphViewModel() instead of viewModel() to initialize. For more reference android documentaion

Update

hiltNavGraphViewModel() is now deprecated, use hiltViewModel() instead

Thanks to Narek Hayrapetyan for the reminder

like image 140
Loveth Avatar answered Sep 17 '22 04:09

Loveth


hiltNavGraphViewModel is deprecated, should be used hiltViewModel() instead

also add dependency androidx.hilt:hilt-navigation-compose:1.0.0-alpha03

like image 39
Narek Hayrapetyan Avatar answered Sep 19 '22 04:09

Narek Hayrapetyan