首页 > 解决方案 > 如何在 mutableStateOf() 中存储一对值

问题描述

我放入SelectPost action选定的帖子(来自@Composable 屏幕)

mainViewModel.actions.offer(MainAction.SelectPost(post))

我在枚举类中定义了屏幕。有时我想导航到另一个屏幕并在它们之间传递数据。在那种情况下,我想传递Post对象

我的视图模型:

class MainViewModel : ViewModel() {

    val state = MainViewState()
    val actions = Channel<MainAction>()

    init {

        viewModelScope.launch {
            try {
                actions.receiveAsFlow().collect { action ->
                    when (action) {
                        is MainAction.SelectPost -> {
                            state.destinationScreen.value = DestinationScreen.POST_DETAILS(action.data)
                        }
                    }
                }
            } catch (e: Exception) {}
        }
    }
}

enum class DestinationScreen(val data: Any? = null){
    DEFAULT,
    POST_DETAILS
}

class MainViewState {
    val destinationScreen = mutableStateOf(DestinationScreen.DEFAULT)
}

sealed class MainAction {
    data class SelectPost(val data: Post) : MainAction()
}

在我的 @Composable 主屏幕中,我观察 viewModel 中的状态,当状态发生变化时,我想导航到选定的屏幕并将数据传递给它。

@Composable
fun AppNavigationHost() {
    val mainViewModel: MainViewModel = viewModel()
    val appNavController = rememberNavController()

    NavHost(
        navController = appNavController,
        startDestination = Screens.HOME.title
    ) {
        when (val destination = mainViewModel.state.destinationScreen.value) {
            DestinationScreen.POST_DETAILS -> {
                composable(DestinationScreen.POST_DETAILS.name) {
                    PostDetailsScreen(destination.data as Post)
                }
            }
            else -> {}
        }
    }
}

问题出在这一行:

is MainAction.SelectPost -> {
    state.destinationScreen.value = DestinationScreen.POST_DETAILS(action.data)
}

POST_DETAILS未解决的参考。由于接收器类型不匹配,以下候选均不适用:

如何将数据设置为枚举类中的项目?我应该使用 Pair() 吗?

标签: kotlinenumskotlin-coroutinesandroid-jetpack-composeandroid-mvvm

解决方案


推荐阅读