onError method

  1. @override
void onError(
  1. DioError error,
  2. ErrorInterceptorHandler handler
)

Called when an exception was occurred during the request.

Implementation

@override
void onError(DioError error, ErrorInterceptorHandler handler) async {
  if (error.response?.statusCode == 401) {
    logger.debug(TAG, 'The token has expired, need to receive new token');

    await refreshToken().then((refreshed) async {
      RequestOptions options = error.response!.requestOptions;

      logger.debug(TAG, 'Is successfully refresh token', {'refresh' : refreshed});

      if (refreshed) {
        onRefreshedToken();

        String accessToken = await authService.getCurrentUserAccessToken();

        options.headers.remove(HttpHeaders.authorizationHeader);
        options.headers[HttpHeaders.authorizationHeader] =
            "Bearer " + accessToken;

        final Dio dioRefresh = Dio(
          BaseOptions(baseUrl: options.baseUrl),
        );

        final Response response = await dioRefresh.request(
          options.path,
          queryParameters: error.requestOptions.queryParameters,
          data: error.requestOptions.data,
          options: Options(
              method: options.method,
              headers: options.headers,
              extra: options.extra,
              sendTimeout: options.sendTimeout,
              receiveTimeout: options.receiveTimeout,
              responseType: options.responseType,
              validateStatus: options.validateStatus,
              receiveDataWhenStatusError: options.receiveDataWhenStatusError,
              followRedirects: options.followRedirects,
              maxRedirects: options.maxRedirects,
              requestEncoder: options.requestEncoder,
              responseDecoder: options.responseDecoder,
              listFormat: options.listFormat,
              contentType: options.contentType),
        );
        return handler.resolve(response);
      }
      else {
        return handler.next(error);
      }
    });
  } else {
    return handler.next(error);
  }
}