【问题标题】:Jetpack compose state management, unable to change background color of CardJetpack compose 状态管理,无法更改 Card 的背景颜色
【发布时间】:2021-04-12 20:08:29
【问题描述】:

使用Jetpack Compose状态管理,当用户点击AlertDialog时,我想在scrollable列表中更改backgroundCard

如下代码所示,我将state 存储为cardState remember

当用户点击AlertDialog 肯定按钮时,我正在更改状态值。

我希望在 state 的值改变后,重组会发生并且 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") } }
    )

【问题讨论】:

    标签: android android-jetpack android-jetpack-compose android-jetpack-compose-text


    【解决方案1】:

    首先在Card 中使用backgroundColor 而不是Modifier.background

       Card(
           backgroundColor = bgColor
        ) 
    

    然后使用不同的东西:

    • card.isInCart 使用MutableState 而不是card-obj
    • 在 Jetpack Compose 中应用状态提升的一般模式

    类似:

    @Composable
    fun prepareCard(card: Card) {
    
        //Use a MutableState for the card.isInCart not the card-obj
        val inCartState = remember { mutableStateOf(card.isInCart) }
    
        //Use colorResource
        var bgColor = colorResource(R.color.white)
    
        if (inCartState.value) {
            bgColor = Color.Blue
        }
    
       Card(
           backgroundColor = bgColor
        ) {
            // Remembering boolean for alert dialog
            val showDialog = remember { mutableStateOf(false) }
    
            if (showDialog.value) {
                alert(
                    showDialog = showDialog.value,
                    onConfirm = { inCartState.value = true},
                    onDismiss = { showDialog.value = false })
            }
    
            Column(Modifier.clickable {
                showDialog.value = true     // on click of Card, changing showDialog state value, which will trigger Alert dialog to be displayed
            }) {
                Image( 
                  //...
                )
                Text(text = /*...*/)
            }
        }
    }
    

    @Composable
    fun alert(showDialog: Boolean,
              onConfirm: () -> Unit,
              onDismiss: () -> Unit) {
    
        if (showDialog) {
            AlertDialog(
                title = { Text("SmartPhone")},
                text = {
                    //.. 
                },
                onDismissRequest = onDismiss, 
                confirmButton = {
                    Button(onClick = onConfirm ){ Text("Ok") }
                },
                dismissButton = { 
                    Button(onClick = onDismiss ){ Text("Cancel") } }
            )
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 2022-11-06
      • 2022-06-15
      • 2023-02-13
      • 1970-01-01
      • 2015-09-26
      • 2021-01-30
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多