Crea diálogos de confirmación y alertas
Aprende paso a paso cómo crear AlertDialogs en Compose:
Un AlertDialog es una ventana emergente que interrumpe el flujo de la aplicación para solicitar una acción del usuario, como confirmar una operación o mostrar información importante.
Eliminar datos, cerrar sesión, salir de la app
Alertas, avisos, mensajes importantes
Errores, validaciones, confirmaciones críticas
Necesitamos una variable que controle cuándo mostrar u ocultar el diálogo:
var mostrarDialogo by rememberSaveable { mutableStateOf(false) }
false → El diálogo está oculto (por defecto)true → El diálogo se muestra en pantallarememberSaveable para mantener el estado durante rotacionesCreamos un botón que cambia el estado a true cuando se presiona:
Button(
onClick = {
mostrarDialogo = true
}
) {
Text(text = "Mostrar Diálogo")
}
mostrarDialogo = trueCuando mostrarDialogo es true, mostramos el AlertDialog:
if (mostrarDialogo) {
AlertDialog(
title = {
Text("Título del Diálogo")
},
text = {
Text("¿Estás seguro de realizar esta acción?")
},
confirmButton = {
TextButton(
onClick = {
// Acción al confirmar
mostrarDialogo = false
}
) {
Text("Aceptar")
}
},
dismissButton = {
TextButton(
onClick = {
// Acción al cancelar
mostrarDialogo = false
}
) {
Text("Cancelar")
}
},
onDismissRequest = {
// Se ejecuta al tocar fuera o botón atrás
mostrarDialogo = false
}
)
}
Botón principal que confirma la acción. Generalmente cierra el diálogo y ejecuta la operación solicitada.
En nuestro caso, simplemente oculta el diálogo con mostrarDialogo = false.
Botón secundario que cancela la acción. Cierra el diálogo sin ejecutar la operación principal.
También establece mostrarDialogo = false.
Lambda que se ejecuta cuando el usuario toca fuera del diálogo o presiona el botón de retroceso. Es obligatorio para permitir que el usuario pueda cerrar el diálogo de estas formas.
Siempre debes cambiar mostrarDialogo = false en los tres lugares (confirmButton, dismissButton y onDismissRequest)
para que el diálogo se cierre correctamente en todos los casos.
Creamos una función reutilizable para no repetir código:
@Composable
fun AlertDialogUi(
title: String,
message: String,
confirmButton: () -> Unit,
dismissButton: () -> Unit
) {
AlertDialog(
title = {
Text(text = title)
},
text = {
Text(text = message)
},
confirmButton = {
TextButton(onClick = confirmButton) {
Text("Aceptar")
}
},
dismissButton = {
TextButton(onClick = dismissButton) {
Text("Cancelar")
}
},
onDismissRequest = dismissButton
)
}
var mostrarDialogo by rememberSaveable { mutableStateOf(false) }
Button(onClick = { mostrarDialogo = true }) {
Text("Eliminar cuenta")
}
if (mostrarDialogo) {
AlertDialogUi(
title = "Eliminar cuenta",
message = "¿Estás seguro de eliminar tu cuenta? Esta acción no se puede deshacer.",
confirmButton = {
// Aquí ejecutarías la lógica de eliminación
mostrarDialogo = false
},
dismissButton = {
mostrarDialogo = false
}
)
}
AlertDialogUi(
title = "Eliminar",
message = "¿Eliminar?"
...
)
AlertDialogUi(
title = "Cerrar sesión",
message = "¿Salir?"
...
)
AlertDialogUi(
title = "Cambios sin guardar",
message = "¿Guardar?"
...
)
AlertDialogUi(
title = "Salir",
message = "¿Cerrar app?"
...
)
El diálogo está oculto, solo se ve el botón
Se ejecuta onClick que cambia el estado a true
La UI se recompone y evalúa la condición if (mostrarDialogo)
Se muestra sobre el contenido actual, bloqueando la interacción con el fondo
Puede: Presionar "Aceptar", "Cancelar", tocar fuera o presionar atrás
El diálogo se cierra y desaparece de la pantalla
onDismissRequestCrea una lista de tareas con confirmación de eliminación:
Usa LazyColumn para mostrar una lista de tareas con un botón de eliminar en cada item
Al presionar eliminar, muestra un diálogo pidiendo confirmación con el nombre de la tarea
Solo elimina la tarea si el usuario confirma en el diálogo
Agrega un segundo diálogo que aparezca después de eliminar diciendo "Tarea eliminada correctamente" con un solo botón de "Aceptar".
false en confirmButton, dismissButton y onDismissRequest@Composable
fun DialogExample() {
var mostrarDialogo by rememberSaveable { mutableStateOf(false) }
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Button(onClick = { mostrarDialogo = true }) {
Text("Mostrar Diálogo")
}
if (mostrarDialogo) {
AlertDialog(
title = { Text("Confirmación") },
text = { Text("¿Deseas continuar con esta acción?") },
confirmButton = {
TextButton(onClick = { mostrarDialogo = false }) {
Text("Aceptar")
}
},
dismissButton = {
TextButton(onClick = { mostrarDialogo = false }) {
Text("Cancelar")
}
},
onDismissRequest = { mostrarDialogo = false }
)
}
}
}
@Composable
fun AlertDialogUi(
title: String,
message: String,
confirmButton: () -> Unit,
dismissButton: () -> Unit
) {
AlertDialog(
title = { Text(text = title) },
text = { Text(text = message) },
confirmButton = {
TextButton(onClick = confirmButton) {
Text("Aceptar")
}
},
dismissButton = {
TextButton(onClick = dismissButton) {
Text("Cancelar")
}
},
onDismissRequest = dismissButton
)
}
// Uso:
@Composable
fun MyScreen() {
var mostrarDialogo by rememberSaveable { mutableStateOf(false) }
Button(onClick = { mostrarDialogo = true }) {
Text("Eliminar cuenta")
}
if (mostrarDialogo) {
AlertDialogUi(
title = "Eliminar cuenta",
message = "Esta acción no se puede deshacer. ¿Continuar?",
confirmButton = {
// Lógica de eliminación aquí
mostrarDialogo = false
},
dismissButton = {
mostrarDialogo = false
}
)
}
}