以下是一个基于 Android Retrofit 思路封装的 Flutter 网络请求框架示例。这个封装会借鉴 Retrofit 的设计模式,包括定义接口、使用注解、以及通过单例模式管理网络请求客户端。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加必要的依赖:
dependencies:
dio: ^5.0.0
retrofit: ^4.0.0
json_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