如何将现有类转为Freezed模型?@Default支持依赖字段的默认值吗?
将MergeGroup转换为Freezed模型的解决方案
首先明确:Freezed的@Default注解仅支持编译时常量作为默认值,无法实现依赖其他字段(比如leftList.length -1)的动态默认值逻辑,所以不能直接用@Default替代原构造函数里的处理。
下面是两种可行的转换方案,完全兼容原代码的逻辑:
方案一:自定义工厂构造函数处理实例创建时的默认值
这种方式保留原有的构造逻辑,通过自定义工厂方法来实现binaryIndex的默认值计算:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'merge_group.freezed.dart'; part 'merge_group.g.dart'; @freezed class MergeGroup with _$MergeGroup { // 基础构造函数,保留nullable的binaryIndex参数 const factory MergeGroup({ required List<String> merged, required List<String> leftList, required List<String> rightList, int? binaryIndex, }) = _MergeGroup; // 自定义工厂方法,自动处理binaryIndex的默认值 factory MergeGroup.withDefaults({ required List<String> merged, required List<String> leftList, required List<String> rightList, int? binaryIndex, }) { return MergeGroup( merged: merged, leftList: leftList, rightList: rightList, binaryIndex: binaryIndex ?? leftList.length - 1, ); } // JSON反序列化方法 factory MergeGroup.fromJson(Map<String, dynamic> json) => _$MergeGroupFromJson(json); }
使用时,调用MergeGroup.withDefaults()即可自动填充binaryIndex的默认值,和原类的构造行为完全一致。
方案二:增强JSON反序列化逻辑,兼容无binaryIndex字段的场景
如果需要在JSON反序列化时也自动处理binaryIndex的默认值(即当JSON中没有该字段时,自动用leftList.length -1填充),可以修改fromJson方法:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'merge_group.freezed.dart'; part 'merge_group.g.dart'; @freezed class MergeGroup with _$MergeGroup { const factory MergeGroup({ required List<String> merged, required List<String> leftList, required List<String> rightList, required int binaryIndex, // 改为非nullable,确保实例始终有值 }) = _MergeGroup; // 自定义工厂构造,处理创建实例时的默认值 factory MergeGroup.create({ required List<String> merged, required List<String> leftList, required List<String> rightList, int? binaryIndex, }) { return MergeGroup( merged: merged, leftList: leftList, rightList: rightList, binaryIndex: binaryIndex ?? leftList.length - 1, ); } // 增强的JSON反序列化逻辑 factory MergeGroup.fromJson(Map<String, dynamic> json) { final temp = _$MergeGroupFromJson(json); // 如果JSON中没有binaryIndex或值为null,用leftList.length-1填充 final binaryIndex = temp.binaryIndex ?? temp.leftList.length - 1; return MergeGroup( merged: temp.merged, leftList: temp.leftList, rightList: temp.rightList, binaryIndex: binaryIndex, ); } }
这种方案将binaryIndex改为非nullable字段,确保所有MergeGroup实例都有有效值,同时覆盖了实例创建和JSON反序列化两种场景的默认值处理。
内容的提问来源于stack exchange,提问作者TSR
相关产品推荐
相关产品推荐

