Flutter如何利用freezed实现API统一响应
在Flutter项目中,我想使用freezed来统一处理API响应格式。目前后端返回的数据结构通常包含code、message和data字段,但不同接口的data结构差异较大。请问如何通过freezed定义通用的响应模型?比如如何实现嵌套的泛型解析,或者如何处理data为不同数据类型(如List/Map)的情况?能否提供一个完整的示例,包括fromJson/toJson的实现以及如何处理异常响应?
2 回复
在Flutter中,使用freezed创建API响应模型,统一处理成功和错误情况。定义基类ApiResponse,包含data和error字段。使用@Freezed注解生成代码,确保类型安全和序列化。通过模式匹配处理不同状态,简化API调用逻辑。
更多关于Flutter如何利用freezed实现API统一响应的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,使用freezed可以方便地创建不可变的数据类,并实现API统一响应处理。以下是具体实现步骤:
- 添加依赖
dependencies:
freezed_annotation: ^2.2.0
dev_dependencies:
build_runner: ^2.3.3
freezed: ^2.3.2
- 创建基础响应模型
import 'package:freezed_annotation/freezed_annotation.dart';
part 'api_response.freezed.dart';
part 'api_response.g.dart';
@freezed
class ApiResponse<T> with _$ApiResponse<T> {
const factory ApiResponse({
required int code,
required String message,
T? data,
}) = _ApiResponse<T>;
factory ApiResponse.fromJson(
Map<String, dynamic> json,
T Function(Object?) fromJsonT,
) => _$ApiResponseFromJson(json, fromJsonT);
}
- 生成代码
flutter pub run build_runner build
- 具体API响应模型示例
// 用户模型
@freezed
class User with _$User {
factory User({
required int id,
required String name,
}) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
// 登录响应
@freezed
class LoginResponse with _$LoginResponse {
factory LoginResponse({
required String token,
required User user,
}) = _LoginResponse;
factory LoginResponse.fromJson(Map<String, dynamic> json) =>
_$LoginResponseFromJson(json);
}
- 使用示例
// API调用
Future<ApiResponse<LoginResponse>> login(String email, String password) async {
final response = await http.post(
Uri.parse('https://api.example.com/login'),
body: {'email': email, 'password': password},
);
return ApiResponse.fromJson(
json.decode(response.body),
(json) => LoginResponse.fromJson(json as Map<String, dynamic>),
);
}
// 使用响应
final apiResponse = await login('test@example.com', 'password');
if (apiResponse.code == 200) {
final loginData = apiResponse.data!;
print('Token: ${loginData.token}');
print('User: ${loginData.user.name}');
} else {
print('Error: ${apiResponse.message}');
}
优势:
- 类型安全,避免运行时错误
- 自动生成toJson/fromJson方法
- 不可变性确保数据一致性
- 支持泛型,可复用同一响应结构
通过这种方式,可以统一处理所有API响应,提高代码的可维护性和类型安全性。

