Как я могу написать диалоговое окно предупреждения в моем проекте kotlin-compose?

Я пытаюсь сделать приложение-словарь. Существует база данных словарной комнаты, где пользователи создают свои собственные словари. Я показываю словари, добавленные пользователями, на экране и хочу, чтобы пользователи удаляли эти словари, когда захотят. Но я работал над этим некоторое время, и есть проблема. Я сам сделал диалоговое окно предупреждения, но когда пользователь нажимает «да», то есть когда пользователь хочет его удалить, он удаляет не словарь, а когда диалоговое окно предупреждения открывается во второй раз, оно удаляет его. Я не мог найти, в чем проблема.

Услышьте мой код

@Composable
fun CreateYourOwnDictionaryScreen(
    navController: NavController,
    viewModel: CreateYourOwnDictionaryViewModel = hiltViewModel()
) {

    val scaffoldState = rememberScaffoldState()
    val state = viewModel.state.value

    val scope = rememberCoroutineScope()

    val context = LocalContext.current
    val showAlertDialog = remember { mutableStateOf(false) }
    var deleteDicState = remember { mutableStateOf(false)}

    if (showAlertDialog.value) {

        AlertDialog(
            onDismissRequest = {

                showAlertDialog.value = false
            },
            title = {
                Text(text = "Dialog Title")
            },
            text = {
                Text("Here is a text ")
            },
            confirmButton = {
                Button(
                    onClick = {
                        showAlertDialog.value = false
                        deleteDicState.value = true
                    }) {
                    Text("This is the Confirm Button")
                }
            },
            dismissButton = {
                Button(

                    onClick = {
                        showAlertDialog.value = false
                    }) {
                    Text("This is the dismiss Button")
                }
            }
        )
    }

    Scaffold(
        scaffoldState = scaffoldState,
        topBar = {
            TopAppBar(
                backgroundColor = bar,
                title = {

                    androidx.compose.material3.Text(
                        text = "your dictionaries",
                        modifier = Modifier.fillMaxWidth(),
                        color = Color.White,
                        fontSize = 22.sp
                    )

                },
                navigationIcon = {
                    IconButton(onClick = {
                        navController.navigate(Screen.MainScreen.route)
                    }) {
                        Icon(
                            imageVector = Icons.Filled.ArrowBack,
                            contentDescription = "Go Back"
                        )
                    }
                }

            )

        },

        floatingActionButtonPosition = FabPosition.Center,
        floatingActionButton = {
            FloatingActionButton(
                onClick = { navController.navigate(Screen.CreateDicScreen.route) },
                backgroundColor = bar,

            ) {
                Icon(Icons.Filled.Add, "fab")
            }
        }
    ) {

        Box(modifier = Modifier.background(MaterialTheme.colors.background)) {



            Column(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(16.dp)
            ) {


                LazyColumn(
                    modifier = Modifier.fillMaxSize()
                ) {
                    items(state.dictionaries) { dictionary ->

                        CreateYourOwnDictionaryItem(
                            dictionary = dictionary,
                            modifier = Modifier
                                .fillMaxWidth()
                                .clickable {
                                    navController.navigate(Screen.MyWordsScreen.passDicId(dictionary.uid))
                                },

                            onAddClick = {
                                  navController.navigate(Screen.MakeYourDictionaryScreen.passDicId(dictionary.uid))
                            },

                            onDeleteClick = {


                                showAlertDialog.value = true
                                if (deleteDicState.value){
                 
                                    println("dictionary state:"+deleteDicState.value)
                                    viewModel.onEvent(
                                        CreateYourOwnDictionaryEvents.DeleteDictionary(dictionary)
                                    )
                                    scope.launch {
                                        val result = scaffoldState.snackbarHostState.showSnackbar(
                                            message = "dictionary is deleted",
                                            /*actionLabel = "Undo",*/
                                            duration = SnackbarDuration.Short
                                        )
                                    }
                                }



                            },
                            onEditClick = {
                                println("on edit click")

                            }

                        )
                    }
                }

            }
        }

    }

}

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

Дополнительный

Кроме того, есть ли наилучшая практика для написания диалогового окна предупреждения в kotlin compose или простой способ повысить производительность или очистить код? потому что по мере роста приложения мои коды начали увеличиваться, и с этим возникли проблемы с производительностью.

какие проблемы с производительностью?

z.g.y 18.11.2022 14:01

Я имею в виду, как я пишу диалог алерта, приложение будет более эффективным и чистым кодом, если есть такое, конечно. Вот что я имел в виду под проблемами с производительностью. Кроме этого, нет никаких проблем с производительностью, связанных с этой проблемой.

NewPartizal 18.11.2022 14:04

Проблема на самом деле не в этом, я просто спросил как-то дополнительно. Если есть такая вещь, как она будет? Я описал основную проблему выше.

NewPartizal 18.11.2022 15:16
1
3
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пожалуйста, переместите диалоговое окно оповещения в блок контента Scaffold для более правильного использования. И вам не нужно удерживать состояние удаления как изменяемое состояние. Если пользователь нажимает кнопку подтверждения в диалоговом окне предупреждения, вы можете отправить deleteEvent в вашу модель представления.

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