Перехватчики Flutter DIO не стреляют

#flutter #dio

Вопрос:

Я создал класс DioClient для обработки всех вызовов API, но по какой-то причине onResponse onError обратные вызовы и не срабатывают. Однако onRequest обратный вызов срабатывает. Что я делаю не так? Вот мой клиент Dio:

     class DioClient{
    final Function(DioError error) onError;
    final Function(Response response) onSuccess;
    final Function(dynamic error) onTimeout;
    final Function onNoNetworkConnection;
    final String url;
    
    final baseUrl = "https://google.com/app";
    final bool authenticatedRequest;
    String token = "";
    Dio _dio;

    DioClient({this.onError, this.onSuccess, this.onTimeout, this.onNoNetworkConnection, this.url, this.authenticatedRequest = false});

    onRequest(RequestOptions options, RequestInterceptorHandler handler){
      if(authenticatedRequest){
        print('requested');
        options.headers["Authorization"] = "Bearer "   token;
        
      }
    }

    setUp() async{
        _dio = Dio();
        if(authenticatedRequest){
          UserDBHelper userDBHelper = UserDBHelper();
          User user = await userDBHelper.getUser();
          token = user.toMap()['token'];
        }
        

        //_dio.interceptors.clear();
    // _dio.interceptors
    //     .add(ApiInterceptors());
    _dio.options.baseUrl = baseUrl;

   // return _dio;
    }

    

    get() async{
      Dio dio = await setUp();
      dio.get(url);
    }

    post(data) async{
      Dio dio = await setUp();
      var response = await _dio.post(url, data: data);
      
    }

}
 

А вот мой пользовательский класс перехватчика:

 class ApiInterceptors extends Interceptor {
  @override
  Future<dynamic> onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
    print('requesting');
    // do something before request is sent
  }

  @override
  Future<dynamic> onError(DioError dioError, ErrorInterceptorHandler handler) async {
    //handler.next(dioError);
    print('done');
    // do something to error
  }

  @override
  Future<dynamic> onResponse(Response response, ResponseInterceptorHandler handler) async {
    print(response.statusCode);
    print('error');
    // do something before response
  }
}
 

Отправка запроса post с post функцией выводится requesting на консоль. Однако ни error (из onRespnse обратного вызова), ни done (из onError обратного вызова) не выводятся на консоль.

Вот контроллер, с которого я отправляю запрос:

 class AuthLogin {
  SharedPreferences prefs;
  
  final String email;
  final String password;
  final Function onWrongLogins;
  final Function onUnVerified;
  final Function onNoNetwork;


  AuthLogin(
      {
        this.email,
        this.password,
        this.onWrongLogins,
        this.onUnVerified,
        this.onNoNetwork
      }){
        loginUser();
      }

      Map<String, dynamic> toMap(){
        return{
          'email': email,
          'password': password
        };
      }

      onError(DioError error){
        var errors = error;
      }

      onSuccess(Response response){
        var res = response;
      }

      loginUser() async{
        DioClient dioClient = DioClient(url: login, onSuccess: onSuccess, onError: onError);
        dioClient.post(toMap());
      }



}
 

Также обратите внимание, что когда я удаляю перехватчик из настройки Dio, он работает так, как должен, и я получаю либо ответ, либо ошибку.

Пожалуйста, я был бы очень признателен за любую помощь, которую я могу получить.

Ответ №1:

Добавьте вызов методов суперкласса в свой класс ApiInterceptors. Ниже приведен пример вашего класса ApiInterceptors.

 class ApiInterceptors extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    print('requesting');
    // do something before request is sent
    super.onRequest(options, handler); //add this line
  }

  @override
  void onError(DioError dioError, ErrorInterceptorHandler handler) {
    //handler.next(dioError);
    print('done');
    // do something to error
    super.onError(dioError, handler); //add this line
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    print(response.statusCode);
    print('error');
    // do something before response
    super.onResponse(response, handler); //add this line
  }
}