Я пытаюсь сделать приложение-словарь. Существует база данных словарной комнаты, где пользователи создают свои собственные словари. Я показываю словари, добавленные пользователями, на экране и хочу, чтобы пользователи удаляли эти словари, когда захотят. Но я работал над этим некоторое время, и есть проблема. Я сам сделал диалоговое окно предупреждения, но когда пользователь нажимает «да», то есть когда пользователь хочет его удалить, он удаляет не словарь, а когда диалоговое окно предупреждения открывается во второй раз, оно удаляет его. Я не мог найти, в чем проблема.
@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 или простой способ повысить производительность или очистить код? потому что по мере роста приложения мои коды начали увеличиваться, и с этим возникли проблемы с производительностью.
Я имею в виду, как я пишу диалог алерта, приложение будет более эффективным и чистым кодом, если есть такое, конечно. Вот что я имел в виду под проблемами с производительностью. Кроме этого, нет никаких проблем с производительностью, связанных с этой проблемой.
Проблема на самом деле не в этом, я просто спросил как-то дополнительно. Если есть такая вещь, как она будет? Я описал основную проблему выше.
Пожалуйста, переместите диалоговое окно оповещения в блок контента Scaffold для более правильного использования. И вам не нужно удерживать состояние удаления как изменяемое состояние. Если пользователь нажимает кнопку подтверждения в диалоговом окне предупреждения, вы можете отправить deleteEvent в вашу модель представления.
какие проблемы с производительностью?