fix(apps): improve ApiInterceptor retry and error handling

This commit is contained in:
qzl
2026-02-25 14:41:27 +08:00
parent 75f4d2c3fb
commit 23f5662e7b
2 changed files with 13 additions and 5 deletions
+3 -2
View File
@@ -19,6 +19,7 @@ class ApiClient {
_dio.interceptors.add(
ApiInterceptor(
tokenStorage: _tokenStorage,
dio: _dio,
onTokenRefresh: _handleTokenRefresh,
),
);
@@ -40,7 +41,7 @@ class ApiClient {
Future<Response<T>> get<T>(String path, {Options? options}) async {
try {
return await _dio.get<T>(path, options: options);
} catch (e) {
} on DioException catch (e) {
throw ApiException.fromDioError(e);
}
}
@@ -52,7 +53,7 @@ class ApiClient {
}) async {
try {
return await _dio.post<T>(path, data: data, options: options);
} catch (e) {
} on DioException catch (e) {
throw ApiException.fromDioError(e);
}
}
+10 -3
View File
@@ -4,8 +4,13 @@ import '../storage/token_storage.dart';
class ApiInterceptor extends Interceptor {
final TokenStorage tokenStorage;
final Future<bool> Function()? onTokenRefresh;
final Dio dio;
ApiInterceptor({required this.tokenStorage, this.onTokenRefresh});
ApiInterceptor({
required this.tokenStorage,
required this.dio,
this.onTokenRefresh,
});
@override
void onRequest(
@@ -28,10 +33,12 @@ class ApiInterceptor extends Interceptor {
if (token != null) {
err.requestOptions.headers['Authorization'] = 'Bearer $token';
try {
final response = await Dio().fetch(err.requestOptions);
final response = await dio.fetch(err.requestOptions);
handler.resolve(response);
return;
} catch (_) {}
} on DioException {
// Retry failed, proceed with original error
}
}
}
}