onError method
Called when an exception was occurred during the request.
Implementation
@override
void onError(DioException err, ErrorInterceptorHandler handler) async {
if (err.response?.statusCode == 401 && tokenRefreshCallback != null) {
final refreshToken = await tokenManager.refreshToken;
if (refreshToken != null) {
try {
final refreshResult = await tokenRefreshCallback!(refreshToken);
await refreshResult.fold(
(error) async {
await tokenManager.clearTokens();
onTokenExpired?.call();
handler.next(err);
},
(newTokenPair) async {
await tokenManager.setTokenPair(newTokenPair);
final retryOptions = err.requestOptions;
retryOptions.headers['Authorization'] =
'Bearer ${newTokenPair.accessToken}';
try {
final retryResponse = await Dio().fetch(retryOptions);
handler.resolve(retryResponse);
} catch (retryError) {
handler.next(err);
}
},
);
} catch (refreshError) {
await tokenManager.clearTokens();
onTokenExpired?.call();
handler.next(err);
}
} else {
await tokenManager.clearTokens();
onTokenExpired?.call();
handler.next(err);
}
} else {
handler.next(err);
}
}