3
respostas

[Dúvida] AlertDialog não está aparecendo no meu projeto do Flutter

Pessoal, boa noite.

Estou tendo uma dificuldade em mostrar um AlertDialog no flutter, estou criando uma função Future com async. A IDE está mostrando uma mensagem relacionada a BuildContext, mas não consegui achar uma solução nos foruns que participo. Caso puderem me ajudar agradeço.

Mensagem sobre Build contexto: " Don't use 'BuildContext's across async gaps. Try rewriting the code to not reference the 'BuildContext' "

Future passwordReset() async {
    try {
      await FirebaseAuth.instance
          .sendPasswordResetEmail(email: _emailcontroller.text.trim());
    } on FirebaseAuthException catch (e) {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: Text(e.message.toString()),
          );
        },
      );
    }
  }
3 respostas

Olá, Jonathas!

A mensagem de erro que você está recebendo se refere ao uso inadequado do BuildContext. No Flutter, o BuildContext é um identificador para a localização de um widget na árvore de widgets. Quando você tenta usar um BuildContext em uma função assíncrona (como a que você está usando para resetar a senha), você pode acabar se referindo a um contexto que já não existe mais, pois a árvore de widgets pode ter sido reconstruída enquanto a função assíncrona estava aguardando.

Uma solução para esse problema seria mover a chamada para showDialog para fora do bloco try/catch e usar uma variável para armazenar a mensagem de erro. Aqui está um exemplo de como você poderia fazer isso:

Future passwordReset() async {
  String errorMessage;
  try {
    await FirebaseAuth.instance
        .sendPasswordResetEmail(email: _emailcontroller.text.trim());
  } on FirebaseAuthException catch (e) {
    errorMessage = e.message.toString();
  }

  if (errorMessage != null) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          content: Text(errorMessage),
        );
      },
    );
  }
}

Neste exemplo, a função assíncrona tenta enviar o e-mail de redefinição de senha como antes. Se ocorrer uma exceção, a mensagem de erro é armazenada na variável errorMessage. Depois que a função assíncrona é concluída, ela verifica se errorMessage é diferente de null. Se for, ela exibe o AlertDialog com a mensagem de erro.

Espero ter ajudado e bons estudos!

Oi Renan, tudo bem?

Primeiramente, muito obrigado pela resposta, mas ainda estou passando pelo mesmo problema, mesmo atualizando o código para a sugestão, ainda vejo a mesma mensagem e o meu alertDialog não aparece, alguma sugestão adicional?

Segue o código atualizado:

Future passwordReset() async {
    String? errorMessage;
    try {
      await FirebaseAuth.instance
          .sendPasswordResetEmail(email: _emailcontroller.text.trim());
    } on FirebaseAuthException catch (e) {
      errorMessage = e.message.toString();
    }
    if (errorMessage != null) {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: Text(errorMessage.toString()),
          );
        },
      );
    }
  }

Só uma correção aqui, a mensagem até aparece, mas não para todos os erros, exemplo: Se eu não colo email nenhum ele aparece o erro, porém se eu coloco um email incorreto ele não mostrar erro nenhum, o que é estranho, pois deveria funcionar com qualquer erro