Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dois dialogs do catchError ao mesmo tempo.

Eu vi mais uma pessoa com este erro, mas não teve mais respostas então criei um tópico novo.

Future<DefaultResponse<Transaction>> _send(Transaction transactionCreated,
      String password, BuildContext context) async {

    final DefaultResponse<Transaction> defaultResponse = await _webClient.save(transactionCreated, password).catchError((e) {
      print('0');
      _showFailureMessage(context, message: e.message);
    }, test: (e) => e is HttpException).catchError((e) {
      print('1');
      _showFailureMessage(context,
          message: 'timeout submitting the transaction');
    }, test: (e) => e is TimeoutException).catchError((e) {
      print('2');

      _showFailureMessage(context);
    }).whenComplete(() {
      setState(() {
        _sending = false;
      });
    });
    return defaultResponse;
  }

Quando mando uma transação com senha errada estou recebendo tanto o erro de http 401 como o erro genério desconhecido.

Vejam que está printando 0 e 2 na sequência

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Esse código eu copiei do github do projeto, só mudei o objeto pois eu uso um objeto default pra poder ter erros da regra de negócio na api.

Por quê será que esta entrando em 2 catchs e não só no primeiro? Tem alguma coisa a ver com as últimas versões do Flutter?

2 respostas
solução!

Não lembro se tive este erro mas a documentação do flutter recomenta usar try-catch quando usando async. link Meu código ficou assim:

Future<Transaction?> _send(
      {required Transaction transactionCreated,
      required String password,
      required BuildContext context}) async {
    setState(() {
      _sending = true;
    });
    try {
      return await _webClient.save(
          transaction: transactionCreated, password: password);
    } on HttpException catch (e) {
      _showFailureMessage(context, message: e.message ?? '');
    } on TimeoutException {
      _showFailureMessage(context,
          message: 'timeout submitting the transaction');
    } catch (e) {
      _showFailureMessage(context);
    } finally {
      setState(() {
        _sending = false;
      });
    }

Obrigado pela ajuda José!

Vou testar, acabei encontrando a recomendação de try catch também no StackOverFlow, mas queria fazer funcionar igual o código do curso.

Aparentemente colocando , test: (e) => e is Exception) no meu último catch também resolveu. Ficou assim:

final DefaultResponse<Transaction> defaultResponse =
        await _webClient.save(transactionCreated, password).catchError(
      (e) {
        print('0');
        _showFailureMessage(context, message: e.message);
    }, test: (e) => e is HttpException).catchError(
      (e) {
        print('1');
        _showFailureMessage(context, message: 'timeout submitting the transaction');
    }, test: (e) => e is TimeoutException).catchError(
      (e) {
        print('2');
        _showFailureMessage(context);
    }, test: (e) => e is Exception).whenComplete(() {
      setState(() {
        _sending = false;
      });
    });