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 response = err.response;
  final alreadyRetried = err.requestOptions.extra[_retryFlag] == true;

  if (alreadyRetried || !_shouldRefreshOn(response)) {
    handler.next(err);
    return;
  }

  final refreshed = await keeper.forceRefresh();
  final refreshedToken = refreshed.dataOrNull;
  if (refreshedToken == null) {
    onRefreshFailed?.call(refreshed.errorOrNull!);
    handler.next(err);
    return;
  }

  final retryOptions = _cloneForRetry(
    err.requestOptions,
    refreshedToken.accessToken,
  );

  try {
    final retryResponse = await dio.fetch<dynamic>(retryOptions);
    handler.resolve(retryResponse);
  } on DioException catch (retryError) {
    handler.next(retryError);
  }
}