Snackbar

El componente de la barra de notificaciones funciona como una breve notificación que se muestra en la parte inferior de la pantalla. Proporciona comentarios sobre una operación o acción sin interrumpir la experiencia del usuario. Las barras de notificaciones desaparecen después de unos segundos. El usuario también puede descartarlo con una acción, como presionar un botón.

Considera estos tres casos de uso en los que podrías usar una barra de notificaciones:

  • Confirmación de la acción: Después de que un usuario borra un correo electrónico o mensaje, aparece una barra de notificaciones para confirmar la acción y ofrecer la opción "Deshacer".
  • Estado de la red: Cuando la app pierde la conexión a Internet, aparece una barra de notificaciones que indica que ahora está sin conexión.
  • Después del envío de datos: Se envía de forma correcta un formulario o se actualiza la configuración, y una barra de notificaciones indica que el cambio se guardó correctamente.

Ejemplo básico

Para implementar una barra de notificaciones, primero debes crear SnackbarHost, que incluye una propiedad SnackbarHostState. SnackbarHostState proporciona acceso a la función showSnackbar(), que puedes usar para mostrar la barra de notificaciones.

Esta función de suspensión requiere un CoroutineScope, como el uso de rememberCoroutineScope, y se puede llamar en respuesta a eventos de la IU para mostrar un Snackbar en Scaffold.

val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
Scaffold(
    snackbarHost = {
        SnackbarHost(hostState = snackbarHostState)
    },
    floatingActionButton = {
        ExtendedFloatingActionButton(
            text = { Text("Show snackbar") },
            icon = { Icon(Icons.Filled.Image, contentDescription = "") },
            onClick = {
                scope.launch {
                    snackbarHostState.showSnackbar("Snackbar")
                }
            }
        )
    }
) { contentPadding ->
    // Screen content
}

Barra de notificaciones con acción

Puedes proporcionar una acción opcional y ajustar la duración de Snackbar. La función snackbarHostState.showSnackbar() acepta parámetros actionLabel y duration adicionales, y muestra un SnackbarResult.

val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
Scaffold(
    snackbarHost = {
        SnackbarHost(hostState = snackbarHostState)
    },
    floatingActionButton = {
        ExtendedFloatingActionButton(
            text = { Text("Show snackbar") },
            icon = { Icon(Icons.Filled.Image, contentDescription = "") },
            onClick = {
                scope.launch {
                    val result = snackbarHostState
                        .showSnackbar(
                            message = "Snackbar",
                            actionLabel = "Action",
                            // Defaults to SnackbarDuration.Short
                            duration = SnackbarDuration.Indefinite
                        )
                    when (result) {
                        SnackbarResult.ActionPerformed -> {
                            /* Handle snackbar action performed */
                        }
                        SnackbarResult.Dismissed -> {
                            /* Handle snackbar dismissed */
                        }
                    }
                }
            }
        )
    }
) { contentPadding ->
    // Screen content
}

Puedes proporcionar una Snackbar personalizada con el parámetro snackbarHost. Consulta los documentos de referencia de la API de SnackbarHost para obtener más información.