android 使用Jetpack编写导航时无法创建视图模型的示例

pgky5nke  于 2023-01-19  发布在  Android
关注(0)|答案(3)|浏览(113)

我正在我的应用程序中使用jetpack组合的导航组件,如下所示:

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

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

        ...
    }
}

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

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

kx1ctssn1#

如果您的@HiltViewModel的作用域是导航图,请使用hiltNavGraphViewModel()而不是viewModel()进行初始化。

    • 更新**

hiltNavGraphViewModel()现在已弃用,请改用hiltViewModel()
感谢Narek Hayrapetyan的提醒

olmpazwi

olmpazwi2#

不建议使用hiltNavGraphViewModel,应改用hiltViewModel()
同时添加依赖项androidx.hilt:hilt-navigation-compose:1.0.0-alpha03

2wnc66cl

2wnc66cl3#

你应该加上这个

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

然后你可以使用这段代码来创建你的视图模型的示例

val viewModel: YourViewModelClass= hiltViewModel()

相关问题