onError method

  1. @override
Future<void> onError(
  1. DioException err,
  2. ErrorInterceptorHandler handler
)

Called when an exception was occurred during the request.

Implementation

@override
Future<void> onError(DioException err, ErrorInterceptorHandler handler) async {
  final options = err.requestOptions;
  final attempt = ((options.extra[_attemptKey] as int?) ?? 0) + 1;
  final statusCode = err.response?.statusCode;
  final isNetworkError = err.response == null;

  if (!_policy.shouldRetry(attempt: attempt, statusCode: statusCode, isNetworkError: isNetworkError)) {
    return handler.next(err);
  }

  final retryAfter = RetryPolicy.parseRetryAfter(err.response?.headers.value('retry-after'));
  await Future<void>.delayed(_policy.delay(attempt, retryAfter: retryAfter));

  options.extra[_attemptKey] = attempt;
  try {
    final response = await _dio.fetch<dynamic>(options);
    return handler.resolve(response);
  } on DioException catch (e) {
    return handler.next(e);
  }
}