Создать AlertDialog не закрывается

У меня есть диалоговое окно, которое я не могу закрыть, когда нажимаю кнопку, это мой код, я считаю, что это для цикла if, но мне нужно, чтобы он был правдой в этих обстоятельствах, любая идея, которая могла бы помочь мне здесь?

@Composable
    fun PopupWindowDialog(
    parentUiState: ParentHomeUiState,
) {
    val openDialog = remember { mutableStateOf(false) }
    var sliderPosition by remember { mutableStateOf(0f) }

    if (!parentUiState.showInAppFeedback){
        openDialog.value = true
    }
    val recommend = sliderPosition.toInt()
    Column(
    ) {
        Box {
            if (openDialog.value) {
                Dialog(
                    onDismissRequest = { openDialog.value = false },
                    properties = DialogProperties(),
                ){
                    Box(
                        Modifier
                            .fillMaxWidth()
                            .fillMaxHeight()
                            //.padding(vertical = 70.dp, horizontal = 10.dp)
                            .padding(vertical = 70.dp )
                            .background(Color.White, RoundedCornerShape(10.dp))
                            //.border(1.dp, color = Color.Black, RoundedCornerShape(20.dp))
                            .border(1.dp, color = Color.White, RoundedCornerShape(20.dp))
                    ) {
                        Button(
                            modifier = Modifier
                                .fillMaxWidth()
                                .padding(10.dp),
                            onClick = {
                              openDialog.value = !openDialog.value
                            }
                        ) {
                            Text(
                                text = "¡Contesta y gana +20 puntos!",
                                style = MaterialTheme.typography.subtitle2,
                                fontWeight = FontWeight.Bold,
                                modifier = Modifier.padding(3.dp))
                        }
                    }
                }
            }
        }
    }
}
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
3
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
У меня есть диалог, который я не могу закрыть, когда нажимаю кнопку

Поскольку вы не показали, как вызывается ваш опубликованный код (составной), я могу предположить, что .showInAppFeedback оценивает true.

Обратите внимание на эти части ваших кодов

val openDialog = remember { mutableStateOf(false) }

...
...

if (!parentUiState.showInAppFeedback) {
    openDialog.value = true
}

, openDialog - это состояние, и когда оно меняет значение, оно re-compose будет LaunchedEffect вашим компонуемым, поэтому, когда диалоговое окно видно и когда вы устанавливаете его в false с помощью нажатия кнопки, весь компонуемый будет перекомпоновываться и переоценивать ваше условие if, снова установите для openDialog.value значение true, и диалоговое окно никогда не закроется.

Я не знаю вашего варианта использования, но вы можете обернуть его внутри .showInAppFeedback

LaunchedEffect(parentUiState.showInAppFeedback) {
    openDialog.value = true
}

Да в том то и дело, я не знаю как предотвратить повторный вход в цикл

user10625391 18.11.2022 16:07

Поскольку parentUiState.showInAppFeedback не обновляется, openDialog.value всегда будет установлено на true при перекомпоновке представления. Вы должны использовать parentUiState.showInAppFeedback в начальном блоке remember, но не для будущей перекомпоновки.

@Composable
fun PopupWindowDialog(parentUiState: ParentHomeUiState) {
    val openDialog = remember { mutableStateOf(!parentUiState.showInAppFeedback) }
    var sliderPosition by remember { mutableStateOf(0f) }

    val recommend = sliderPosition.toInt()
    Column {
        Box {
            if (openDialog.value) {
                Dialog(
                    onDismissRequest = { openDialog.value = false },
                    properties = DialogProperties(),
                ) {
                    Box(
                        Modifier
                            .fillMaxWidth()
                            .fillMaxHeight()
                            //.padding(vertical = 70.dp, horizontal = 10.dp)
                            .padding(vertical = 70.dp)
                            .background(Color.White, RoundedCornerShape(10.dp))
                            //.border(1.dp, color = Color.Black, RoundedCornerShape(20.dp))
                            .border(1.dp, color = Color.White, RoundedCornerShape(20.dp))
                    ) {
                        Button(
                            modifier = Modifier
                                .fillMaxWidth()
                                .padding(10.dp),
                            onClick = {
                                openDialog.value = !openDialog.value
                            }
                        ) {
                            Text(
                                text = "¡Contesta y gana +20 puntos!",
                                style = MaterialTheme.typography.subtitle2,
                                fontWeight = FontWeight.Bold,
                                modifier = Modifier.padding(3.dp)
                            )
                        }
                    }
                }
            }
        }
    }
}

Другие вопросы по теме