1
resposta

[Bug] Tratamento de exceções - o sistema para e levanta a exceção e não está indo para o tratamento(.cathError)

Fiz conforme explicado no vídeo, mas o aplicativo levanta o HttpException e não esta indo pro tratamento, ele só vai depois que eu clico para continuar, aí sim ele entra no showExceptionDialog.

auth_service.dart

Future<bool> login({required String email, required String password}) async {
    http.Response response = await client.post(
      Uri.parse("${url}login"),
      body: {
        'email': email,
        'password': password,
      },
    );
    if (response.statusCode != 200) {
      String content = json.decode(response.body);

      switch (content) {
        case "Cannot find user":
          throw UserNotFindException();
      }
      throw HttpException(response.body);
    }
    saveUsersInfo(response.body);
    return true;
  }

login_screen.dart

login(BuildContext context) async {
    String email = _emailController.text;
    String password = _passwordController.text;

    service.login(email: email, password: password).then(
      (resultLogin) {
        if (resultLogin) {
          Navigator.pushReplacementNamed(context, "home");
        }
      },
    ).catchError(
      (error) {
        var innerError = error as HttpException;
        showExceptionDialog(context, content: innerError.message);
      },
      test: (error) => error is HttpException,
    ).catchError(
      (error) {
        showConfirmationDialog(
          context,
          content:
              "Conta inexistente!\nDeseja registrar-se com o login e senha informados?",
          affirmativeOption: "Registrar",
        ).then(
          (value) {
            if (value != null && value) {
              service
                  .register(email: email, password: password)
                  .then((resultRegister) {
                if (resultRegister) {
                  Navigator.pushReplacementNamed(context, "home");
                }
              });
            }
          },
        );
      },
      test: (error) => error is UserNotFindException,
    );
  }
1 resposta

Olá, Jefferson!

Pelo que entendi, o problema que você está enfrentando é que o aplicativo não está indo para o tratamento de exceções quando ocorre um HttpException. Ele só vai para o tratamento depois que você clica para continuar, correto?

Uma possível solução para esse problema é utilizar o async e await na função login em vez de utilizar then e catchError. Dessa forma, você terá um código mais legível e estruturado.

Veja como ficaria o código utilizando async e await:

login(BuildContext context) async {
  String email = _emailController.text;
  String password = _passwordController.text;

  try {
    bool resultLogin = await service.login(email: email, password: password);
    if (resultLogin) {
      Navigator.pushReplacementNamed(context, "home");
    }
  } on HttpException catch (error) {
    showExceptionDialog(context, content: error.message);
  } on UserNotFindException {
    showConfirmationDialog(
      context,
      content: "Conta inexistente!\nDeseja registrar-se com o login e senha informados?",
      affirmativeOption: "Registrar",
    ).then((value) {
      if (value != null && value) {
        service.register(email: email, password: password).then((resultRegister) {
          if (resultRegister) {
            Navigator.pushReplacementNamed(context, "home");
          }
        });
      }
    });
  }
}

Dessa forma, o código ficará mais claro e você poderá tratar as exceções de forma mais eficiente.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software