2
respostas

Unknown error sempre aparecendo

Talvez eu tenha escrito algum código errado e não percebi. Sempre aparece o Unknown error antes de aparecer outro erro. Por exemplo, Unknown error aparece antes de Authentication failed:

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

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

Código do transaction_webclient:

class TransactionWebClient {
  Future<List<Transaction>> findAll() async {
    final Response response = await get(baseUrl);
    final List<dynamic> decodedJson = jsonDecode(response.body);
    return decodedJson
        .map((dynamic json) => Transaction.fromJson(json))
        .toList();
  }

  Future<Transaction> save(Transaction transaction, String password) async {
    final String transactionJson = jsonEncode(transaction.toJson());

    await Future.delayed(Duration(seconds: 2));

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


    if(response.statusCode == 200) {
      return Transaction.fromJson(jsonDecode(response.body));
    }
    throw HttpException(_getMessage(response.statusCode));
  }

  String? _getMessage(int statusCode) {
    if(_statusCodeResponses.containsKey(statusCode)){
      return _statusCodeResponses[statusCode];
    }
    return 'Unknown eror.';
  }

  static final Map<int, String> _statusCodeResponses = {
    400 :'There was an error submitting transaction.',
    401 : 'Authentication failed!',
    409: 'Transaction already exists.'
  };
}

class HttpException implements Exception {
  final String? message;

  HttpException(this.message);
}
2 respostas

Oi Lucas!

Seguinte dei uma olhadinha aqui no seu códio e é exatamente como você disse:

Você ta retornando um Unknown eror 100% das vezes, se liga:

// inicio da função para salvar...

Future<Transaction> save(Transaction transaction, String password) async {
    final String transactionJson = jsonEncode(transaction.toJson());

    await Future.delayed(Duration(seconds: 2));

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

// se der tudo certo retorne o corpo da informação 
    if(response.statusCode == 200) {
      return Transaction.fromJson(jsonDecode(response.body));
    }

    // jogue uma excessão DEPOIS QUE FIZER TUDO, independente de ter dado erro ou nao

    throw HttpException(_getMessage(response.statusCode));
  }

// se a mensagem existir, vou retornar um um status code e depois vou retornar um unkown eror.

  String? _getMessage(int statusCode) {
    if(_statusCodeResponses.containsKey(statusCode)){
      return _statusCodeResponses[statusCode];
    }
    return 'Unknown eror.';
  }

Seu pecado foi esquecer do else nas condições if / else.

Eu dei uma olhada no código do professor, e o meu está igual: https://github.com/alura-cursos/flutter-crashlytics/blob/master/lib/http/webclients/transaction_webclient.dart

Será que o problema não está em outro lugar?