Flutter实现Retrofit风格的网络请求封装
以下是一个基于 Android Retrofit 思路封装的 Flutter 网络请求框架示例。这个封装会借鉴 Retrofit 的设计模式,包括定义接口、使用注解、以及通过单例模式管理网络请求客户端。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加必要的依赖:
dependencies:dio: ^5.0.0retrofit: ^4.0.0json_annotation: ^4.8.0
2. 定义数据模型
使用 json_annotation
来定义数据模型,这类似于 Retrofit 中的 Gson 转换器。
import 'package:json_annotation/json_annotation.dart';part 'user.g.dart';()
class User {(name: 'id')int id;(name: 'name')String name;(name: 'email')String email;User({required this.id, required this.name, required this.email});factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
3. 定义 API 接口
定义一个接口来描述网络请求,使用 Retrofit 的注解风格。
import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';part 'api_service.g.dart';()
abstract class ApiService {factory ApiService(Dio dio, {String baseUrl}) = _ApiService;("/users/{id}")Future<User> getUser(("id") int userId);("/users")Future<User> createUser(() User user);
}
4. 创建 Retrofit 实例
创建一个单例类来管理 Retrofit 实例,类似于 Retrofit 的初始化。
import 'package:dio/dio.dart';
import 'api_service.dart';class RetrofitClient {static final RetrofitClient _instance = RetrofitClient._internal();late ApiService _apiService;factory RetrofitClient() {return _instance;}RetrofitClient._internal() {final dio = Dio(BaseOptions(baseUrl: "https://api.example.com/"));_apiService = ApiService(dio);}ApiService get apiService => _apiService;
}
5. 使用封装的网络请求
在你的 Flutter 应用中使用封装的网络请求。
import 'package:flutter/material.dart';
import 'retrofit_client.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget { Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Retrofit Example')),body: Center(child: ElevatedButton(onPressed: () async {try {var user = await RetrofitClient().apiService.getUser(1);print(user.name);} catch (e) {print(e);}},child: Text('Get User'),),),),);}
}
6. 生成代码
由于使用了 retrofit
和 json_annotation
,你需要运行以下命令来生成代码:
flutter pub run build_runner build
总结
通过以上步骤,你可以创建一个类似于 Retrofit 的网络请求框架。这个框架利用了 Retrofit 的注解和接口定义方式,同时结合了 Flutter 的 Dio 库来实现网络请求。这种方式不仅代码清晰,而且易于维护和扩展。
下面是一个优化后的 Flutter 网络请求框架,增加了环境切换功能,并进行了全面增强:
完整封装方案(带环境切换)
// network/dio_client.dart
import 'package:dio/dio.dart';
import 'package:logger/logger.dart';class DioClient {static final DioClient _instance = DioClient._internal();late Dio _dio