如何在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
相关产品推荐
相关产品推荐

