Flutter如何利用freezed实现API统一响应

在Flutter项目中,我想使用freezed来统一处理API响应格式。目前后端返回的数据结构通常包含code、message和data字段,但不同接口的data结构差异较大。请问如何通过freezed定义通用的响应模型?比如如何实现嵌套的泛型解析,或者如何处理data为不同数据类型(如List/Map)的情况?能否提供一个完整的示例,包括fromJson/toJson的实现以及如何处理异常响应?

2 回复

在Flutter中,使用freezed创建API响应模型,统一处理成功和错误情况。定义基类ApiResponse,包含dataerror字段。使用@Freezed注解生成代码,确保类型安全和序列化。通过模式匹配处理不同状态,简化API调用逻辑。

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


在Flutter中,使用freezed可以方便地创建不可变的数据类,并实现API统一响应处理。以下是具体实现步骤:

  1. 添加依赖
dependencies:
  freezed_annotation: ^2.2.0

dev_dependencies:
  build_runner: ^2.3.3
  freezed: ^2.3.2
  1. 创建基础响应模型
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);
}
  1. 生成代码
flutter pub run build_runner build
  1. 具体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);
}
  1. 使用示例
// 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响应,提高代码的可维护性和类型安全性。

回到顶部