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

如何在Entity/Model中根据其他属性值设置默认属性值?

解决方案

1. 重构Entity(Folder类)

既然global的值完全由id决定,没必要让外部手动传入这个参数,直接在构造函数内部自动计算即可,彻底避免传入错误值的可能:

class Folder extends Equatable {
  const Folder({
    required this.id,
  }) : global = id == 0; // 根据id直接推导global值

  final int id;
  final bool global;

  @override
  List<Object> get props => [id, global];
}

现在创建Folder实例时只需要传入id,global会自动生成,完全符合需求。

2. 重构Model(FolderModel类)

因为FolderModel继承自Folder,所以也要对齐逻辑,不让外部手动传入global,同时处理好copyWith和序列化/反序列化逻辑:

class FolderModel extends Folder {
  FolderModel({
    required super.id,
  }) : super(); // 父类构造会自动计算global

  FolderModel copyWith({
    int? id,
  }) {
    return FolderModel(
      id: id ?? this.id,
      // 无需传入global,新实例会根据新id自动计算
    );
  }

  Map<String, dynamic> toMap() {
    final result = <String, dynamic>{};
  
    result.addAll({'id': id});
    result.addAll({'global': global}); // 保留序列化global,适配后端需求
  
    return result;
  }

  factory FolderModel.fromMap(Map<String, dynamic> map) {
    final id = map['id']?.toInt() ?? 0;
    // 不依赖后端返回的global,强制根据id推导
    return FolderModel(id: id);
  }

  String toJson() => json.encode(toMap());

  factory FolderModel.fromJson(String source) => FolderModel.fromMap(json.decode(source));
}

核心思路

  • 把global的推导逻辑封装在类内部,保证数据一致性:无论何时创建实例,global都会和id严格对应,不会出现矛盾的情况。
  • 不需要额外写外部函数,这种封装方式符合面向对象的设计原则,代码更简洁也更易维护。
  • 如果后端返回的global是可信的,也可以在fromMap里改成优先使用后端值,但如果需求是强制按id判断,就用上面的写法。

内容的提问来源于stack exchange,提问作者Daniel Roldán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:30:54