feat:增加dio网络请求

This commit is contained in:
2025-07-15 19:54:32 +08:00
parent 3f12b03648
commit c8f93f15a1
16 changed files with 570 additions and 126 deletions

View File

@@ -1,6 +1,6 @@
import 'package:dio/dio.dart';
import 'package:food_hub_app/utils/sp_util.dart';
import 'package:food_hub_app/widgets/common/index.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
class HttpUtil {
static final HttpUtil _instance = HttpUtil._internal();
@@ -38,8 +38,10 @@ class HttpUtil {
if (options.data != null) {
print("请求参数: ${options.data}");
}
// token等操作
// options.headers['Authorization'] = 'Bearer your_token';
if (SPUtil.getString('token').isNotEmpty) {
options.headers['satoken'] = SPUtil.getString('token');
}
return handler.next(options);
},
),
@@ -60,18 +62,7 @@ class HttpUtil {
_dio.interceptors.add(
InterceptorsWrapper(
onError: (DioException e, handler) {
if (e.response != null) {
final responseData = e.response?.data;
if (responseData is Map<String, dynamic>) {
// JSON错误格式
print(responseData['message']?.toString());
showErrorToast('错误');
} else {
// JSON格式错误
print('网络错误: ${e.message}');
}
}
_handleError(e);
return handler.next(e);
},
),
@@ -79,7 +70,7 @@ class HttpUtil {
}
//
Future<T?> _request<T>(
Future<T> _request<T>(
String path, {
required String method,
dynamic data,
@@ -99,21 +90,15 @@ class HttpUtil {
return converter(response.data);
}
// T是dynamic
if (T == dynamic) {
return response.data as T;
}
//
return response.data as T?;
return response.data;
} catch (e) {
_handleError(e);
rethrow;
}
}
// GET请求
Future<T?> get<T>(
Future<T> get<T>(
String path, {
Map<String, dynamic>? queryParameters,
T Function(dynamic data)? converter,
@@ -125,7 +110,7 @@ class HttpUtil {
);
// POST请求
Future<T?> post<T>(
Future<T> post<T>(
String path, {
dynamic data,
Map<String, dynamic>? queryParameters,
@@ -139,7 +124,7 @@ class HttpUtil {
);
// PUT请求
Future<T?> put<T>(
Future<T> put<T>(
String path, {
dynamic data,
Map<String, dynamic>? queryParameters,
@@ -153,7 +138,7 @@ class HttpUtil {
);
// DELETE请求
Future<T?> delete<T>(
Future<T> delete<T>(
String path, {
dynamic data,
Map<String, dynamic>? queryParameters,
@@ -191,32 +176,68 @@ class HttpUtil {
//
void _handleError(dynamic error) {
String errorMessage = '未知错误';
if (error is DioException) {
switch (error.type) {
case DioExceptionType.connectionTimeout:
print("连接超时");
errorMessage = '连接超时,请检查网络连接';
break;
case DioExceptionType.sendTimeout:
print("发送超时");
errorMessage = '发送超时,请检查网络连接';
break;
case DioExceptionType.receiveTimeout:
print("接收超时");
errorMessage = '接收超时,请检查网络连接';
break;
case DioExceptionType.cancel:
print("请求取消");
errorMessage = '请求取消';
break;
case DioExceptionType.badCertificate:
print("证书错误");
errorMessage = '证书验证失败';
break;
case DioExceptionType.badResponse:
print("错误响应");
// HTTP响应错误4xx, 5xx
final statusCode = error.response?.statusCode ?? 0;
final responseData = error.response?.data;
if (responseData is Map<String, dynamic> && responseData.containsKey('message')) {
//
errorMessage = responseData['message']?.toString() ?? '未知错误';
} else {
errorMessage = _getHttpErrorMessage(statusCode);
}
break;
case DioExceptionType.connectionError:
print("连接错误");
errorMessage = '网络连接错误,请检查网络设置';
break;
case DioExceptionType.unknown:
print("未知错误");
if (error.error != null) {
errorMessage = '未知错误: ${error.error.toString()}';
}
errorMessage = '发生未知错误';
break;
}
} else {
print("未知错误: $error");
errorMessage = '非Dio错误: $error';
}
print(errorMessage);
showErrorToast(errorMessage);
}
String _getHttpErrorMessage(int statusCode) {
// HTTP状态码返回对应的错误消息
switch (statusCode) {
case 400: return '错误请求,请检查参数';
case 401: return '未授权,请登录';
case 403: return '禁止访问,权限不足';
case 404: return '资源不存在';
case 405: return '方法不允许';
case 408: return '请求超时';
case 500: return '服务器内部错误';
case 502: return '网关错误';
case 503: return '服务不可用';
case 504: return '网关超时';
default: return 'HTTP错误: $statusCode';
}
}
}

61
lib/utils/sp_util.dart Normal file
View File

@@ -0,0 +1,61 @@
import 'package:shared_preferences/shared_preferences.dart';
class SPUtil {
static late SharedPreferences _prefs;
/// 初始化
static Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
}
/// 存储数据
static Future<bool> set(String key, dynamic value) {
if (value is String) return _prefs.setString(key, value);
if (value is int) return _prefs.setInt(key, value);
if (value is bool) return _prefs.setBool(key, value);
if (value is double) return _prefs.setDouble(key, value);
if (value is List<String>) return _prefs.setStringList(key, value);
throw ArgumentError('Unsupported value type: ${value.runtimeType}');
}
/// 获取数据
static dynamic get(String key, [dynamic defaultValue]) {
if (!_prefs.containsKey(key)) return defaultValue;
return _prefs.get(key) ?? defaultValue;
}
/// 获取字符串
static String getString(String key, [String defaultValue = '']) {
return _prefs.getString(key) ?? defaultValue;
}
/// 获取布尔值
static bool getBool(String key, [bool defaultValue = false]) {
return _prefs.getBool(key) ?? defaultValue;
}
/// 获取整数
static int getInt(String key, [int defaultValue = 0]) {
return _prefs.getInt(key) ?? defaultValue;
}
/// 获取浮点数
static double getDouble(String key, [double defaultValue = 0.0]) {
return _prefs.getDouble(key) ?? defaultValue;
}
/// 获取字符串列表
static List<String> getStringList(String key, [List<String> defaultValue = const []]) {
return _prefs.getStringList(key) ?? defaultValue;
}
/// 删除数据
static Future<bool> remove(String key) {
return _prefs.remove(key);
}
/// 清空所有数据
static Future<bool> clear() {
return _prefs.clear();
}
}