Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Implementação de dialogs de confirmação

Segue a minha implementação para o desafio:

Criei o arquivo confirmation_dialog.dart em lib/core/helpers conforme segue:

import 'package:flutter/material.dart';

Future<bool?> showConfirmationDialog(
  BuildContext context,
  String content,
) async {
  return showDialog<bool>(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: const Text("Atenção"),
        content: Text(content),
        actions: <Widget>[
          TextButton(
            onPressed: () {
              Navigator.of(context).pop(false);
            },
            child: const Text("Cancelar"),
          ),
          TextButton(
            onPressed: () {
              Navigator.of(context).pop(true);
            },
            child: const Text("Confirmar"),
          ),
        ],
      );
    },
  );
}

Na home_screen ajustei as funções saveOnServer, syncWithServer e clearServerData para apresentar o dialog de confirmação:

saveOnServer() async {
    bool? confirma = await showConfirmationDialog(
      context,
      "Confirma a sobrescrita dos dados na nuvem?",
    );
    if (confirma != null && confirma) {
      await _dioService.saveLocalToServer(_appDatabase).then((error) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text((error != null) ? error : "Dados salvos."),
            duration: const Duration(seconds: 3),
          ),
        );
      });
    }
  }
  
  syncWithServer() async {
    bool? confirma = await showConfirmationDialog(
      context,
      "Confirma a syncronização local com o servidor?",
    );
    if (confirma != null && confirma) {
      await _dioService.getDataFromServer(_appDatabase).then((error) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text((error != null) ? error : "Dados sincronizados."),
            duration: const Duration(seconds: 3),
          ),
        );
      });
    }
    refresh();
  }

  clearServerData() async {
    bool? confirma = await showConfirmationDialog(
      context,
      "Confirma a exclusão dos dados na nuvem?",
    );
    if (confirma != null && confirma) {
      await _dioService.clearServerData().then((error) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(
              (error != null) ? error : "Dados excluídos no servidor.",
            ),
            duration: const Duration(seconds: 3),
          ),
        );
      });
    }
  }
  ...

Atenção! Esta implementação já está na versão final do projeto, contendo todas as implementações realizadas neste módulo.

Abraço!

1 resposta

Bom dia, Ricardo! Tranquilo?

Gostei demais da sua solução, continue assim!

Mandou muito bem explorando o AlertDialog para criar diálogos de confirmação com Flutter, aplicou de maneira eficiente o Navigator.pop para retornar valores e entendeu como usar o SnackBar para dar feedback ao usuário após cada ação.

E um detalhe curioso para aprimorar seria centralizar a lógica de exibição de mensagens em uma função utilitária, evitando repetição de código. Exemplo:

void showSnack(BuildContext context, String message) {
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text(message),
      duration: const Duration(seconds: 3),
    ),
  );
}

Isso faz com que o código fique mais limpo e fácil de manter.

Para aprimorar suas soluções, algumas boas práticas são:

  • Reuso: criar um helper único para confirmação e feedback.
  • UX: adicionar ícones ou cores diferentes nos botões para reforçar a ação.
  • Internacionalização: preparar os textos para múltiplos idiomas usando Intl.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: o que você gostaria de praticar mais agora, melhorar a experiência do usuário com internacionalização ou refatorar o código para reduzir duplicações e aumentar o reuso?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!