17

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 }
        }
    }
}
1

4 Answers 4

23

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

Sign up to request clarification or add additional context in comments.

2 Comments

I noticed that hiltNavGraphViewModel will return the same view model after navigating to a different view and then back. Would it also be possible to get a new model instance after each navigation?
hiltNavGraphViewModel is deprecated, should be used hiltViewModel () instead.
5

hiltNavGraphViewModel is deprecated, should be used hiltViewModel() instead

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

Comments

5

You should add this

implementation("androidx.hilt:hilt-navigation-compose:1.0.0")

then you can use this code for create instance of your viewmodel

val viewModel: YourViewModelClass= hiltViewModel()

Comments

1

You can use viewModel() as well, but check that owning Activity or Fragment has been annotated with @AndroidEntryPoint.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.