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

Problema com a classe LoggingInterceptor

Copiei o código do jeito que foi passado durante a aula, importei o http_interceptor no início do código e instalei a dependencia da mesma versão que foi usada pelo professor. Mas está dando vários erros.

Onde está declarada a classe LoggingInterceptor aparece esta mensagem:

Missing concrete implementations of 'InterceptorContract.shouldInterceptRequest' and 'InterceptorContract.shouldInterceptResponse'.
Try implementing the missing methods, or make the class abstract.

No RequestData aparece isso:

The name 'RequestData' isn't a type, so it can't be used as a type argument.
Try correcting the name to an existing type, or defining a type named 'RequestData'.

No InterceptRequest vem esta mensagem:

'LoggingInterceptor.interceptRequest' ('Future<InvalidType> Function({required InvalidType data})') isn't a valid override of 'InterceptorContract.interceptRequest' ('Future<BaseRequest> Function({required BaseRequest request})').

E no InterceptResponse vem isso:

'LoggingInterceptor.interceptResponse' ('Future<InvalidType> Function({required InvalidType data})') isn't a valid override of 'InterceptorContract.interceptResponse' ('Future<BaseResponse> Function({required BaseResponse response})').

Como posso resolver isso?

3 respostas

Olá, Guilherme! Parece que você está enfrentando alguns problemas com o LoggingInterceptor. Vamos tentar resolvê-los juntos!

Primeiramente, as mensagens de erro que você está recebendo indicam que a classe LoggingInterceptor está faltando as implementações dos métodos shouldInterceptRequest e shouldInterceptResponse do InterceptorContract. No entanto, pelo conteúdo da aula, esses métodos não são necessários, pois estamos sobrescrevendo os métodos interceptRequest e interceptResponse. Portanto, isso pode indicar que você está utilizando uma versão diferente da biblioteca http_interceptor da que foi usada na aula. Verifique se você está realmente usando a versão 1.0.2, como recomendado.

Quanto ao erro "The name 'RequestData' isn't a type, so it can't be used as a type argument.", parece que o tipo RequestData não está sendo reconhecido. Isso pode ser devido à falta de importação da biblioteca http_interceptor, que define esse tipo. Certifique-se de que você tenha a seguinte linha no início do seu arquivo:

import 'package:http_interceptor/http_interceptor.dart';

Os erros "'LoggingInterceptor.interceptRequest' ('Future<InvalidType> Function({required InvalidType data})') isn't a valid override of 'InterceptorContract.interceptRequest' ('Future<BaseRequest> Function({required BaseRequest request})')." e "'LoggingInterceptor.interceptResponse' ('Future<InvalidType> Function({required InvalidType data})') isn't a valid override of 'InterceptorContract.interceptResponse' ('Future<BaseResponse> Function({required BaseResponse response})')." estão relacionados aos erros anteriores. Depois de corrigir os problemas mencionados, esses erros devem desaparecer.

Aqui está um exemplo de como a classe LoggingInterceptor deve se parecer:

import 'package:http_interceptor/http_interceptor.dart';

class LoggingInterceptor implements InterceptorContract {
  @override
  Future<RequestData> interceptRequest({required RequestData data}) async {
    print(data.toString());
    return data;
  }

  @override
  Future<ResponseData> interceptResponse({required ResponseData data}) async {
    print(data.toString());
    return data;
  }
}

Espero ter ajudado e bons estudos!

Então, eu já coloquei a dependencia desse jeito:

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2
  uuid: ^3.0.6
  google_fonts: ^6.1.0
  http: ^1.2.0
  http_interceptor: ^1.0.2
  logger: ^1.1.0

Mas continua dando este erro. E a classe está desse jeito:

import 'package:http_interceptor/http_interceptor.dart';
import 'package:logger/logger.dart';

class LoggingInterceptor implements InterceptorContract {
  Logger logger = Logger();
  @override
  Future<RequestData> interceptRequest({required RequestData data}) async {
    logger.v(
      "Requisição para ${data.baseUrl}\nCabeçalhos: ${data.headers}\nCorpo: ${data.body}"
    );
    return data;
  }

  @override
  Future<ResponseData> interceptResponse({required ResponseData data}) async {
    if (data.statusCode ~/100 ==2){
      logger.i(
        "Resposta de ${data.url}\nStatus da Resposta: ${data.statusCode}/nCabeçalhos: ${data.headers}\nCorpo: ${data.body}"
      );
    } else {
      logger.e(
        "Resposta de ${data.url}\nStatus da Resposta: ${data.statusCode}/nCabeçalhos: ${data.headers}\nCorpo: ${data.body}"
      );
    }
    return data;
  }

}
solução!

Resolvi o problema. Estava dando conflito entre as dependências e tive que mudar suas versões. Deixei elas assim:

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2
  uuid: ^3.0.6
  google_fonts: ^4.0.0
  http: ^0.13.4
  http_interceptor: ^1.0.2
  logger: ^1.1.0

Eu tive que alterar a versão do google_fonts porque antes dava este erro:

../../../../../../../AppData/Local/Pub/Cache/hosted/pub.dev/google_fonts-3.0.1/lib/src/google_fonts_base.dart:14:1: Error: 'AssetManifest' is imported from both 'package:flutter/src/services/asset_manifest.dart' and 'package:google_fonts/src/asset_manifest.dart'.
import 'asset_manifest.dart';