onError method
Called when an exception was occurred during the request.
Implementation
@override
void onError(DioError err, ErrorInterceptorHandler handler) async {
debugPrint(
"❌ ERROR [${err.response?.statusCode}] => ${err.requestOptions.uri} \n"
"BODY: ${err.response?.data}",
);
if (err.response?.statusCode == 401 && refreshToken != null) {
try {
// Attempt to refresh the token
final newTokenData = await refreshToken!.call();
final newAccessToken = newTokenData['access_token'] ?? '';
if (newAccessToken.isNotEmpty) {
await saveToken?.call(newAccessToken);
// Clone the original request with new token
final options = err.requestOptions;
options.headers['Authorization'] = 'Bearer $newAccessToken';
final response = await Dio().fetch(
options,
); // لا تعيّن requestOptions على dio.options
return handler.resolve(response);
}
} catch (e) {
debugPrint("❌ Token refresh failed: $e");
return handler.reject(
DioError(
requestOptions: err.requestOptions,
error: e,
type: DioErrorType.badResponse,
),
);
}
}
handler.next(err);
}