onError method

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

Called when an exception was occurred during the request.

Implementation

@override
void onError(
  DioException err,
  ErrorInterceptorHandler handler,
) async {
  // Check if we should refresh token
  final shouldRefresh = shouldRefreshToken?.call(err.response?.statusCode) ??
      err.response?.statusCode == 401;

  if (!shouldRefresh) {
    return handler.next(err);
  }

  // If already refreshing, queue this request
  if (_isRefreshing) {
    _queueRequest(err.requestOptions, handler);
    return;
  }

  // Start refresh process
  _isRefreshing = true;

  try {
    // Attempt to refresh token
    final refreshed = await tokenManager.refreshToken();

    if (refreshed) {
      // Refresh succeeded - retry original request
      _isRefreshing = false;

      // Retry queued requests first
      await _retryQueuedRequests();

      // Retry the failed request
      final response = await _retryRequest(err.requestOptions);
      return handler.resolve(response);
    } else {
      // Refresh failed - clear tokens and fail all requests
      _isRefreshing = false;
      await tokenManager.clearTokens();
      _failQueuedRequests(err);
      return handler.next(err);
    }
  } catch (e) {
    // Refresh threw an error - fail all requests
    _isRefreshing = false;
    _failQueuedRequests(err);
    return handler.next(err);
  }
}