Files
flutterApp/lib/core/network/dio_client.dart

80 lines
2.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:dio/dio.dart';
import 'package:maibu_satabot_v2/core/consts/http_api_consts.dart';
import 'package:maibu_satabot_v2/core/app/app_user_cubit.dart';
import 'package:maibu_satabot_v2/core/di/injection.dart';
import 'package:maibu_satabot_v2/features/auth/presentation/bloc/auth_cubit.dart';
class DioClient {
static Dio create() {
final dio = Dio(
BaseOptions(
baseUrl: HttpApiConsts.baseUrl,
connectTimeout: const Duration(seconds: 20),
receiveTimeout: const Duration(seconds: 20),
headers: {'Content-Type': 'application/json'},
),
);
dio.interceptors.add(
LogInterceptor(
requestBody: true,
responseBody: true,
requestHeader: true,
),
);
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
final userCubit = sl<AppUserCubit>();
final token = userCubit.state.user?.token;
if (token != null && token.isNotEmpty) {
options.headers['Authorization'] = 'Bearer $token';
}
return handler.next(options);
},
onResponse: (response, handler) {
if (response.data is Map<String, dynamic>) {
final code = response.data['code'];
if (code == 401 || code == 403) {
// 🔥 仅在当前确实处于登录态时,才把 401 当作「登录过期」弹窗。
// 退出登录过程中 AppUserCubit.user 已被清为 null,此时残留/竞态请求
// 返回的 401 不应再打扰用户(人已经在退出了),否则会误弹「登录已过期」。
if (sl<AppUserCubit>().state.user != null) {
print(
'>>> [DIO] 🚨🚨🚨 收到业务错误码 $code,触发 Token 过期处理!URL: ${response.requestOptions.uri},时间: ${DateTime.now()}',
);
try {
sl<AuthCubit>().tokenExpired();
} catch (ex) {}
}
}
}
return handler.next(response);
},
onError: (DioException e, handler) async {
if (e.response?.statusCode == 401 || e.response?.statusCode == 403) {
// 🔥 同上:已退出登录(user==null)时不再触发过期弹窗
if (sl<AppUserCubit>().state.user != null) {
print(
'>>> [DIO] 🚨🚨🚨 收到 HTTP ${e.response?.statusCode},触发 Token 过期处理!URL: ${e.requestOptions.uri},时间: ${DateTime.now()}',
);
try {
sl<AuthCubit>().tokenExpired();
} catch (ex) {}
}
}
return handler.next(e);
},
),
);
return dio;
}
}