flutter中网络请求dio简单封装
时间: 2025-06-23 19:22:47 浏览: 15
<think>好的,用户想了解如何在Flutter中使用Dio进行网络请求的简单封装。首先,我需要回顾Dio的基本用法,然后思考如何有效地封装它以提高代码复用性和可维护性。用户提供的引用内容提到封装时需要注意返回类型的处理,比如Response和BaseModel的区别,还有错误处理和加载体验。这些点都需要在回答中涵盖。
首先,我应该介绍Dio的基本配置,比如设置baseUrl和超时时间。然后,可能需要添加拦截器来处理请求和响应,比如添加Loading动画和统一错误处理。接着,封装GET和POST方法是常见的需求,用户可能需要示例代码来参考。此外,引用中的项目地址和详细步骤提示我应该提供一个结构化的封装示例,可能包括单例模式、拦截器、请求方法封装以及模型转换。
用户可能对错误处理的具体实现比较关注,比如如何捕获DioException并转换为友好的错误提示。同时,返回类型的处理,如使用泛型和BaseModel来解析数据,也是关键点。需要确保示例代码符合最新的Dio版本,并且注释清晰,方便用户理解。
另外,用户提供的引用提到维护和使用的方便性,所以封装后的方法应该简洁易用。可能需要提到如何调用封装后的方法,比如使用DioManager单例,并处理不同的响应类型。最后,生成的相关问题需要与封装的不同方面相关,比如性能优化、错误处理扩展和模型转换方法,这样用户可以有进一步学习的路径。
总结下来,回答需要分步骤讲解封装的各个部分,提供代码示例,并引用提供的资料来支持关键点,比如错误处理和模型转换。同时,确保代码格式正确,使用$...$和$$...$$标记数学表达式(虽然在这个问题中可能用不到,但需要留意)。最后,生成的相关问题要帮助用户深入探索封装的其他方面。</think>### Flutter Dio网络请求封装步骤
#### 1. 基础配置
```dart
class DioManager {
static final DioManager _instance = DioManager._internal();
late Dio _dio;
factory DioManager() => _instance;
DioManager._internal() {
_dio = Dio(BaseOptions(
baseUrl: "https://api.example.com",
connectTimeout: const Duration(seconds: 15),
receiveTimeout: const Duration(seconds: 15),
));
_addInterceptors(); // 添加拦截器[^2]
}
}
```
#### 2. 拦截器封装(含错误处理)
```dart
void _addInterceptors() {
_dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
// 显示Loading弹窗
showLoading();
return handler.next(options);
},
onError: (DioException error, handler) async {
// 统一错误处理
hideLoading();
_handleError(error);
return handler.next(error);
},
onResponse: (response, handler) {
// 隐藏Loading
hideLoading();
return handler.next(response);
}
));
}
void _handleError(DioException error) {
String message = "网络异常";
if (error.type == DioExceptionType.connectionTimeout) {
message = "连接超时";
}
// 显示Toast提示
showToast(message);
}
```
#### 3. 请求方法封装
```dart
// GET请求封装
Future<T> get<T>(String path, {Map<String, dynamic>? params}) async {
try {
final response = await _dio.get(path, queryParameters: params);
return _parseResponse<T>(response); // 使用泛型解析响应[^4]
} on DioException catch (e) {
throw _handleError(e);
}
}
// POST请求封装
Future<T> post<T>(String path, {dynamic data}) async {
try {
final response = await _dio.post(path, data: data);
return _parseResponse<T>(response);
} on DioException catch (e) {
throw _handleError(e);
}
}
```
#### 4. 响应解析(支持模型转换)
```dart
T _parseResponse<T>(Response response) {
if (T == Response) return response as T; // 直接返回原始响应
final baseModel = BaseModel.fromJson(response.data);
if (baseModel.code != 200) {
throw AppError(baseModel.message);
}
if (T == BaseModel) return baseModel as T;
return _convertModel<T>(baseModel.data); // 自定义模型转换方法
}
```
阅读全文
相关推荐

















