Flutter如何封装freezed实现API统一响应

在Flutter项目中,我想使用freezed来封装API的统一响应格式,但不太清楚具体如何实现。目前我们的API返回结构包含code、message和data字段,希望能通过freezed自动生成模型类,同时统一处理错误响应和成功响应的解析逻辑。有没有完整的示例或最佳实践可以参考?应该如何定义freezed的模型类,并结合Dio或其他网络库实现类型安全的响应解析?

2 回复

使用Freezed封装API统一响应:

  1. 定义基础响应模型:
@freezed
class ApiResponse<T> with _$ApiResponse<T> {
  const factory ApiResponse.success(T data) = Success;
  const factory ApiResponse.error(String message) = Error;
}
  1. 在API调用中转换:
ApiResponse<User> response = await api.getUser();
return response.when(
  success: (data) => data,
  error: (msg) => throw Exception(msg),
);
  1. 配合json_annotation处理序列化。

更多关于Flutter如何封装freezed实现API统一响应的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,使用freezed封装API统一响应可以简化数据模型处理,增强类型安全。以下是实现步骤:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  freezed_annotation: ^2.0.0

dev_dependencies:
  build_runner: ^2.0.0
  freezed: ^2.0.0

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.success({
    required T data,
    required int code,
    String? message,
  }) = Success<T>;

  const factory ApiResponse.error({
    required int code,
    required String message,
    T? data,
  }) = Error<T>;

  factory ApiResponse.fromJson(
    Map<String, dynamic> json,
    T Function(Object?) fromJsonT,
  ) => _$ApiResponseFromJson(json, fromJsonT);
}

3. 生成代码

运行命令生成freezed代码:

flutter pub run build_runner build

4. 使用示例

// 具体数据模型
@freezed
class User with _$User {
  factory User({required String name, required int age}) = _User;
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

// 解析API响应
ApiResponse<User> parseUserResponse(Map<String, dynamic> json) {
  return ApiResponse.fromJson(json, (json) => User.fromJson(json as Map<String, dynamic>));
}

// 使用
void handleResponse(ApiResponse<User> response) {
  response.when(
    success: (data, code, message) => print('用户数据: ${data.name}'),
    error: (code, message, data) => print('错误: $message'),
  );
}

优势:

  • 类型安全,避免运行时错误
  • 模式匹配处理成功/错误状态
  • 支持泛型,可复用
  • 自动生成JSON序列化代码

通过这种方式,可以统一处理API响应,提高代码可维护性。

回到顶部