Как обновить переменную с помощью Jetpack compose ~ Сопрограмма Kotlin

#android #kotlin #kotlin-coroutines #android-jetpack-compose

Вопрос:

/** Так как будет более одной кнопки, которая может открыть диалоговое окно. Например, кнопка социальных сетей, которая открывает окно другого стиля . Номер телефона, где вы можете увидеть номер телефона..и т.д. Поэтому я хочу иметь только одну функцию, в которой есть все подробности, касающиеся диалога, чем каждая кнопка будет обновлять переменную и передавать ее в функцию диалога. */

 @Composable
fun CardSell(modifier: Modifier = Modifier){

    val (showDialog, setShowDialog) = remember { mutableStateOf(false) }

    var setDialogTitle : String = "" //Update this variable

    val padding = 9.dp
    val scope = rememberCoroutineScope()

    Column(Modifier
        .clickable(onClick = {})) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Card(elevation = 4.dp) {
                Column {
                    Row(modifier = Modifier.padding(all = 8.dp)){
                        Image(
                            painter = painterResource(id = R.drawable.ic_launcher_foreground),
                            contentDescription = "Contact Profile Picture",
                            modifier = Modifier
                                .size(40.dp)
                                .clip(CircleShape)
                        )
                    }

                    Row(modifier = Modifier
                        .fillMaxWidth()
                        .padding(8.dp),
                            horizontalArrangement = Arrangement.SpaceEvenly){

                        IconButton(
                            onClick = {
                                setShowDialog(true)
                                scope.launch {
                                    setDialogTitle = "Phone Number: ${user.contact.phoneNumber}"
                                    delay(100)
                                }

                            },
                        ) { //Phone Icon
                            Icon(
                                Icons.Filled.Phone,
                                contentDescription = "Phone Number"
                            )
                        }

                        }
                    }
                    
                    DialogDemo(showDialog, setShowDialog, setDialogTitle)

                }
            }
        }
    }
}
 

Комментарии:

1. Вы хотите изменить setDialogTitle переменную откуда? Я предполагаю , что вы хотите передать его в DialogDemo , но откуда его изменить? Разрабатывать

Ответ №1:

В compose вы никогда не захотите использовать локальную переменную без remember , это не сохранит ее состояние после перекомпозиции

Вы можете объявить это тремя способами:

  1. Имея как сеттера, так и геттера, как вы сделали с showDialog
 val (value, setValue) = remember { mutableStateOf("") }
 
  1. Имея один MutableState val
 // declare
val setDialogTitle = remember { mutableStateOf("") }

// read/write
setDialogTitle.value = "new value"
 
  1. Использование делегированного свойства. Я нахожу его самым чистым:
 // declare
var setDialogTitle by remember { mutableStateOf("") }

// read/write
setDialogTitle = "new value"
 

Ознакомьтесь с дополнительной документацией

Комментарии:

1. Большое вам спасибо за помощь