【问题标题】:Cannot create an instance of viewmodel while using Jetpack Compose navigation使用 Jetpack Compose 导航时无法创建视图模型实例
【发布时间】:2021-01-20 13:09:22
【问题描述】:

我在我的应用程序中使用导航组件进行喷气背包撰写,如下所示:

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

【问题讨论】:

标签: android android-jetpack-compose android-jetpack-navigation


【解决方案1】:

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

更新

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

感谢Narek Hayrapetyan的提醒

【讨论】:

  • 我注意到hiltNavGraphViewModel 在导航到不同的视图然后返回后会返回相同的视图模型。是否也可以在每次导航后获取一个新的模型实例?
  • hiltNavGraphViewModel 已弃用,应改用hiltViewModel ()
【解决方案2】:

hiltNavGraphViewModel 已弃用,应改用hiltViewModel()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-25
    • 2022-07-20
    • 2011-12-20
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多