Jetpack 撰写重组

问题描述 投票:0回答:1

我有问题,我需要了解如何解决它..

我在片段内有一个打开撰写叠加层的按钮。

    private fun onClicked() {
    binding.composeView.setContent {
        cashDialogComposableView()
    }
}

我想要做的是创建一个处理覆盖状态本身的撰写视图。不需要任何东西来调用这个覆盖,就像调用这一行 cashDialogComposableView 并传递覆盖模型一样简单。

这就是撰写屏幕代码:

@Composable
fun cashDialogComposableView() {
val cashDialogViewModel: CashDialogViewModel = viewModel()
cashDialogViewModel.changeCashDialogVisibility(true)

when (cashDialogViewModel.cashDialogVisibility.collectAsState().value) {
    true -> {
        cashDialogScreen(
            cashDialogModel = CashDialogModel(
                title = "",
                subtitle = "",
                confirmButtonAction = {},
                cancelButtonAction = {},
                icon = R.drawable.error_icon
            )
        ) {
            cashDialogViewModel.changeCashDialogVisibility(false)
        }
    }
    false -> {
        return
    }
}

}

当用户单击按钮时,它会调用此方法..并且第一个状态为true..并且当用户关闭覆盖层时,它会将状态更改为false并且覆盖层将隐藏。当用户再次单击时,第一行将状态更改为 true .. 但这没有发生 .. 发生的情况是当用户单击关闭状态更改,然后屏幕重新组合并再次调用

cashDialogViewModel.changeCashDialogVisibility(true) 
此行之后隐藏的叠加层再次显示。

我尝试了很多东西,比如

LaunchedEffect
和`DisposableEffect。

如何解决这个问题?

kotlin state jetpack
1个回答
0
投票

简单的方法

val visibility = remember { mutableStateOf(true) }

你想使用viewModel

class AppViewModel : ViewModel() {

    private val _cashDialogVisibility = MutableStateFlow(true)
    val cashDialogVisibility get() = _cashDialogVisibility.asStateFlow()

    fun setVisibility(visibility: Boolean){
        _cashDialogVisibility.value = visibility
    }
}

功能

@Composable
fun CashDialogComposableView() {
    val cashDialogViewModel: AppViewModel = viewModel()

    val visibility = cashDialogViewModel.cashDialogVisibility.collectAsState()

    when {
        visibility.value -> {
            AlertDialog(
                icon = {
                    Icon(imageVector = Icons.Default.Warning, contentDescription = "Alert Dialog Icon")
                },
                title = {
                    Text(text = "Hello")
                },
                text = {
                    Text(text = "World")
                },
                onDismissRequest = {
                    cashDialogViewModel.setVisibility(false)
                },
                confirmButton = {
                    TextButton(
                        onClick = {
                            cashDialogViewModel.setVisibility(true)
                        }
                    ) {
                        Text(
                            text = "OK")
                    }
                },
                dismissButton = {
                    TextButton(
                        onClick = {
                            cashDialogViewModel.setVisibility(false)
                        }
                    ) {
                        Text(
                            text = "Cancel")
                    }
                }
            )
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.