Snackbar

O componente de snackbar serve como uma notificação breve que aparece na parte de baixo da tela. Ele fornece feedback sobre uma operação ou ação sem interromper a experiência do usuário. As barras de informações desaparecem após alguns segundos. O usuário também pode dispensar o alerta com uma ação, como tocar em um botão.

Considere estes três casos de uso em que você pode usar uma snackbar:

  • Confirmação de ação:depois que um usuário exclui um e-mail ou uma mensagem, uma snackbar aparece para confirmar a ação e oferecer a opção "Desfazer".
  • Status da rede:quando o app perde a conexão de Internet, uma snackbar aparece para informar que ele está off-line.
  • Envio de dados:ao enviar um formulário ou atualizar as configurações, uma barra de informações informa que a alteração foi salva.
Figura 1. Exemplos de snackbar.

Exemplo básico

Para implementar uma snackbar, primeiro crie SnackbarHost, que inclui uma propriedade SnackbarHostState. SnackbarHostState fornece acesso à função showSnackbar(), que pode ser usada para mostrar a snackbar.

Essa função de suspensão exige um CoroutineScope, como o uso de rememberCoroutineScope, e pode ser chamada em resposta a eventos da IU para mostrar um Snackbar em um 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
}

Snackbar com ação

Você pode fornecer uma ação opcional e ajustar a duração da Snackbar. A função snackbarHostState.showSnackbar() aceita outros parâmetros actionLabel e duration e retorna um 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
}

É possível fornecer uma Snackbar personalizada com o parâmetro snackbarHost. Consulte as documentações de referência da API SnackbarHost para mais informações.

Pontos principais

  • actionLabel = "Action": define o texto do botão de ação.
  • withDismissAction = true: fornece uma cruz na snackbar. Toque nele para fechar a barra de informações.
  • duration = SnackbarDuration.Indefinite: mantém a snackbar mostrada até que o usuário ou o programa a descarte.
  • SnackbarResult.ActionPerformed: significa que o usuário clicou no botão de ação da barra de informações.
  • SnackbarResult.Dismissed: significa que o usuário dispensou a snackbar sem clicar no botão de ação.