Reputation: 1221
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 }
}
}
}
Upvotes: 16
Views: 10475
Reputation: 401
You can use viewModel()
as well, but check that owning Activity
or Fragment
has been annotated with @AndroidEntryPoint
.
Upvotes: 1
Reputation: 1903
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()
Upvotes: 5
Reputation: 431
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
Upvotes: 22
Reputation: 1929
hiltNavGraphViewModel
is deprecated, should be used hiltViewModel()
instead
also add dependency androidx.hilt:hilt-navigation-compose:1.0.0-alpha03
Upvotes: 5