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

TimeoutException nao funciona

Olá. Seguindo os passos do curso de Flutter, notei que AULA 03 Evitando múltiplos problemas no passo que fala de Timeout, o catchError....test: (e) => e is TimeoutException não consegue capturar a execption lançada pelo client. Quando Deixo apenas a referência "Exception", dessa forma no trecho: test: (e) => e is Exception, aí sim ele pega a exceção e apresenta no Dialog a mensagem capturada corretamente: TimeoutException after 0:00:05.000000: Future not completed. Já comparei meu codigo com o codigo do git. Não tem nada anormal. Seria um problema com a classe TimeoutException ?

Notei tb que a classe que customizamos nomeando como HttpException, já existe no Dart: https://api.dart.dev/stable/2.8.2/dart-io/HttpException-class.html, teria algum impacto ?

4 respostas

Há mais de uma hora eu estava tentando resolver o mesmo problema sem sucesso. A TimeoutException não é capturada, usando a classe mais genérica "Exception" funciona, como relatado pelo Cassiano.

EDIT: Debugando o código com exception.runtimeType, percebi a a Exception retornada nesse caso é uma HttpInterceptorException e não TimeoutException. Então colocando esse tipo no teste ele será capturado.

No entanto, achei um outro contorno. Se remover requestTimeout do WebClient e adicionar .timeout na TransactionWebClient vai ser gerada uma exceção TimeoutException como esperado inicialmente.

    final Response response = await client.post(
      baseUrl,
      headers: {
        'Content-type': 'application/json',
        'password': password,
      },
      body: transactionJson,
    ).timeout(Duration(seconds: 5));

Boa Nilton, funcinou aqui também com sua dica.

Porém, eu baixei o pacote/projeto da aula flutter-webapi-2-aula-3 e funcionou, nesse projeto, da forma como é passada no curso. Ainda não sei dizer porque.

Mas vamos seguindo no aprendizado.

Obrigado pela ajuda.

solução!

Também estou com o mesmo problema. Para contornar esta situação, adicionei o seguinte código:

final Response response = await client.post(
      baseUrl,
      headers: {
        'content-type': 'application/json',
        'password': password,
      },
      body: jsonTransacaoEncode,
    ).timeout(client.requestTimeout);

Observe que adicionei o timeout e obtive do requestTimeout definido no client conforme apresentado na aula:

timeout(client.requestTimeout)

Show!