You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中使用Freezed为该模型创建自定义模型转换器?

在Flutter中用Freezed创建带自定义转换器的模型

1. 先添加依赖

在pubspec.yaml中配置所需依赖:

dependencies:
  flutter:
    sdk: flutter
  freezed_annotation: ^2.4.1
  json_annotation: ^4.8.1

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.4.4
  freezed: ^2.4.5
  json_serializable: ^6.7.1

2. 实现自定义转换器

根据图中模型的字段需求(比如枚举类型的category、数值类型转换的price),以下是两种常见场景的转换器实现:

场景1:枚举与字符串互转

import 'package:json_annotation/json_annotation.dart';

// 定义Category枚举
enum Category { electronics, clothing, books }

// 自定义转换器:枚举 ↔ 字符串
class CategoryConverter implements JsonConverter<Category, String> {
  const CategoryConverter();

  @override
  Category fromJson(String json) {
    switch (json) {
      case 'electronics':
        return Category.electronics;
      case 'clothing':
        return Category.clothing;
      case 'books':
        return Category.books;
      default:
        throw ArgumentError('未知分类: $json');
    }
  }

  @override
  String toJson(Category object) {
    switch (object) {
      case Category.electronics:
        return 'electronics';
      case Category.clothing:
        return 'clothing';
      case Category.books:
        return 'books';
    }
  }
}

场景2:整数转浮点数

class PriceConverter implements JsonConverter<double, int> {
  const PriceConverter();

  @override
  double fromJson(int json) => json.toDouble();

  @override
  int toJson(double object) => object.toInt();
}

3. 用Freezed定义模型并绑定转换器

结合图中的id/name/price/category字段,编写Freezed模型:

import 'package:freezed_annotation/freezed_annotation.dart';

part 'product_model.freezed.dart';
part 'product_model.g.dart';

@freezed
class Product with _$Product {
  const factory Product({
    required int id,
    required String name,
    // 给price字段绑定数值转换器
    @PriceConverter() required double price,
    // 给category字段绑定枚举转换器
    @CategoryConverter() required Category category,
  }) = _Product;

  // JSON解析方法
  factory Product.fromJson(Map<String, dynamic> json) =>
      _$ProductFromJson(json);
}

4. 生成代码

在终端执行命令生成Freezed和JSON序列化代码:

flutter pub run build_runner build

如果需要实时监听文件变化自动重新生成:

flutter pub run build_runner watch

5. 使用示例

// 从API返回的JSON解析模型
final productJson = {
  "id": 1,
  "name": "智能手机",
  "price": 2999,
  "category": "electronics"
};

final product = Product.fromJson(productJson);
print(product.price); // 输出2999.0(double类型)
print(product.category); // 输出Category.electronics

// 将模型转为JSON
final json = product.toJson();
print(json['price']); // 输出2999(int类型)
print(json['category']); // 输出"electronics"

内容的提问来源于stack exchange,提问作者Kevin Alexis Martinez Herrera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:25:18