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项目。
        
      
            
            
            
