onError method
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);
}
}