Flutter如何通过retrofit和dio实现统一网络请求
在Flutter项目中,我想通过retrofit和dio实现统一的网络请求管理,但遇到几个问题:
- retrofit如何与dio结合使用?是否需要额外配置?
- 统一的请求拦截和错误处理该怎么实现?比如在dio中全局处理401错误或token刷新
- 能否给出一个完整的示例,包括请求封装、响应解析和异常捕获的最佳实践?
- 如何处理不同API的差异化需求(如部分接口需要特殊header)?
目前尝试时总感觉代码分散,求指教!
2 回复
使用 Retrofit 和 Dio 实现统一网络请求的步骤:
- 添加依赖:
dio、retrofit、json_annotation等。 - 创建数据模型,使用
json_serializable注解。 - 定义 API 接口,用
@RestApi注解,声明请求方法。 - 通过
Retrofit生成请求类,结合 Dio 实例配置基础 URL、拦截器等。 - 在拦截器中统一处理错误、日志和令牌。
示例代码:
@RestApi(baseUrl: "https://api.example.com/")
abstract class ApiClient {
factory ApiClient(Dio dio) = _ApiClient;
@GET("/user")
Future<User> getUser();
}
更多关于Flutter如何通过retrofit和dio实现统一网络请求的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,通过Retrofit和Dio实现统一网络请求,可以简化HTTP请求的编写和管理。以下是具体实现步骤:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
retrofit: ^5.0.0
dio: ^5.0.0
logger: ^2.0.0
dev_dependencies:
retrofit_generator: ^5.0.0
build_runner: ^2.0.0
2. 创建Dio实例与配置
创建 dio_client.dart 文件,配置Dio实例(如超时、拦截器等):
import 'package:dio/dio.dart';
import 'package:retrofit/retrofit.dart';
final dio = Dio(BaseOptions(
baseUrl: 'https://api.example.com',
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
))
..interceptors.add(LogInterceptor(
requestBody: true,
responseBody: true,
));
3. 定义API接口
创建 api_service.dart 文件,使用Retrofit注解定义接口:
import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';
part 'api_service.g.dart';
@RestApi(baseUrl: 'https://api.example.com')
abstract class ApiService {
factory ApiService(Dio dio, {String baseUrl}) = _ApiService;
@GET('/users')
Future<List<User>> getUsers();
@POST('/users')
Future<User> createUser(@Body() User user);
}
4. 生成代码
运行命令生成实现代码:
flutter pub run build_runner build
5. 统一请求处理
创建 network_manager.dart 封装统一逻辑:
class NetworkManager {
static final ApiService _apiService = ApiService(dio);
static Future<T> request<T>(Future<T> Function() apiCall) async {
try {
return await apiCall();
} on DioException catch (e) {
throw _handleError(e);
}
}
static String _handleError(DioException e) {
switch (e.type) {
case DioExceptionType.connectionTimeout:
return '连接超时';
case DioExceptionType.badResponse:
return '服务器错误: ${e.response?.statusCode}';
default:
return '网络请求失败';
}
}
}
// 使用示例
Future<void> fetchUsers() async {
final users = await NetworkManager.request(() => _apiService.getUsers());
print(users);
}
关键点说明
- Dio配置:统一设置超时、拦截器(日志、认证等)
- Retrofit注解:简化API定义,自动生成实现代码
- 错误处理:集中管理网络异常和业务错误
- 统一入口:通过
NetworkManager封装所有请求,便于维护
通过这种方式,可以实现简洁、可维护的网络请求架构,适合中大型Flutter项目。

