我有问题,我需要了解如何解决它..
我在片段内有一个打开撰写叠加层的按钮。
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。
如何解决这个问题?
简单的方法
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")
}
}
)
}
}
}