使用 Jetpack Compose 导航时无法创建视图模型的实例

Cannot create an instance of viewmodel while using Jetpack Compose navigation

我在我的应用中使用 Jetpack Compose 的导航组件,如下所示:

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

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

        ...
    }
}

我在我的 MainScreen 可组合项中得到 viewmodel,如下所示:

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

这给了我一个运行时异常 Cannot create an instance of class com.package.main.MainViewModel

在这里,我声明这只会在使用导航组件时发生,即一切正常,并且 mainViewModel 在我的应用程序中使用导航组件之前已成功实例化。

MainViewModel是这样的:

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

如果您的@HiltViewModel 的范围限定为导航图,请使用 hiltNavGraphViewModel() 而不是 viewModel() 进行初始化。更多参考android documentaion

更新

hiltNavGraphViewModel() 现已弃用,请改用 hiltViewModel()

感谢Narek Hayrapetyan提醒

hiltNavGraphViewModel 已弃用,应使用 hiltViewModel() 代替

同时添加依赖androidx.hilt:hilt-navigation-compose:1.0.0-alpha03