使用 Jetpack Compose 状态管理,我想在用户点击时更改background
列表Card
scrollable
AlertDialog
如下代码所示,我state
用cardState
记住的方式存储
当用户单击AlertDialog
肯定按钮时,我正在更改状态值。
我期望在 state 的值改变后,Recomposition会发生并且 UI 会被更新。背景颜色是根据这个状态设置的
cardState.value.isInCart
代码 :
@Preview(showBackground = true)
@Composable
fun prepareCard(card: Card) {
// Remembering card state for adding in cart
val cardState = remember { mutableStateOf(card) }
var bgColor = R.color.white
if (cardState.value.isInCart) { // Setting background color based on state here
bgColor = android.R.color.holo_blue_light
}
MyApplicationTheme() {
androidx.compose.material.Card(
modifier = Modifier.background(color = Color(bgColor)) // using background color here
) {
// Remembering boolean for alert dialog
val showDialog = remember { mutableStateOf(false) }
if (showDialog.value) {
alert(cardState, { showDialog.value = false }) // showing alert from here
}
Column(Modifier.clickable {
showDialog.value = true // on click of Card, changing showDialog state value, which will trigger Alert dialog to be displayed
}) {
Image(
modifier = Modifier
.fillMaxWidth()
.height(200.dp),
contentScale = ContentScale.Fit,
painter = painterResource(id = card.imageId),
contentDescription = ""
)
Text(text = card.name)
}
}
}
}
@Composable
fun alert(cardState: MutableState<Card>, dismiss: () -> Unit = { }) {
AlertDialog(
title = {
Text("SmartPhone")
},
text = {
Row(
modifier = Modifier
.horizontalScroll(rememberScrollState(0))
) {
Text(text = cardState.value.name)
Image(
modifier = Modifier
.width(200.dp)
.height(200.dp),
contentScale = ContentScale.Fit,
painter = painterResource(id = cardState.value.imageId),
contentDescription = cardState.value.name
)
}
}, onDismissRequest = dismiss, // This will help to dismiss alert from outside touch
confirmButton = {
Button(onClick = {
// Add this item in cart === Changing the state here on positive button click, now I am expecting that after Alert will be dismisssed with outside touch then the Card's background would change to holo blue because isInCard is true
cardState.value.isInCart = true
}) { Text("Ok") }
},
dismissButton = { Button(onClick = {}) { Text("Cancel") } }
)