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

扩展Amplify自动生成的Patient类创建GaitPatient遇构造函数错误

扩展AWS Amplify生成的Patient类时的构造函数问题

背景代码

AWS Amplify Studio生成的Patient基类核心代码如下:

@immutable
class Patient extends Model {
  static const classType = const _PatientModelType();
  final String id;
  final String? _name;
  final String? _family_name;
  final TemporalDate? _dob;
  final Gender? _gender;
  final double? _height_in_inches;
  final List<Assessment>? _Assessments;
  final TemporalDateTime? _createdAt;
  final TemporalDateTime? _updatedAt;

  // ... 省略其他代码
  
  const Patient._internal({required this.id, required name, required family_name, required dob, required gender, required height_in_inches, Assessments, createdAt, updatedAt}): _name = name, _family_name = family_name, _dob = dob, _gender = gender, _height_in_inches = height_in_inches, _Assessments = Assessments, _createdAt = createdAt, _updatedAt = updatedAt;
  
  factory Patient({String? id, required String name, required String family_name, required TemporalDate dob, required Gender gender, required double height_in_inches, List<Assessment>? Assessments}) {
    return Patient._internal(
      id: id == null ? UUID.getUUID() : id,
      name: name,
      family_name: family_name,
      dob: dob,
      gender: gender,
      height_in_inches: height_in_inches,
      Assessments: Assessments != null ? List<Assessment>.unmodifiable(Assessments) : Assessments);
  }
  
  // ... 省略其他代码
  
  Patient.fromJson(Map<String, dynamic> json)  
    : id = json['id'],
      _name = json['name'],
      _family_name = json['family_name'],
      _dob = json['dob'] != null ? TemporalDate.fromString(json['dob']) : null,
      _gender = enumFromString<Gender>(json['gender'], Gender.values),
      _height_in_inches = (json['height_in_inches'] as num?)?.toDouble(),
      _Assessments = json['Assessments'] is List
        ? (json['Assessments'] as List)
          .where((e) => e?['serializedData'] != null)
          .map((e) => Assessment.fromJson(new Map<String, dynamic>.from(e['serializedData'])))
          .toList()
        : null,
      _createdAt = json['createdAt'] != null ? TemporalDateTime.fromString(json['createdAt']) : null,
      _updatedAt = json['updatedAt'] != null ? TemporalDateTime.fromString(json['updatedAt']) : null;
  
  // ... 省略其他代码
}

遇到的错误

创建GaitPatient子类时,出现以下错误:

父类'Patient'的未命名构造函数(由GaitPatient的默认构造函数调用)必须是生成式构造函数,但找到的是工厂构造函数。请尝试添加一个具有不同超类初始化器的显式构造函数,或者将父类构造函数'Patient Patient(...)'修改为非工厂构造函数

可选解决方案

  • 方案1:直接调用父类私有构造函数_internal
    Patient类内置了私有的生成式构造函数_internal,可以在子类构造函数里显式调用它,既符合Dart继承规则,又能复用父类初始化逻辑。示例代码:

    class GaitPatient extends Patient {
      // 子类特有属性
      final String gaitType;
    
      GaitPatient({
        required super.id,
        required super.name,
        required super.family_name,
        required super.dob,
        required super.gender,
        required super.height_in_inches,
        super.Assessments,
        required this.gaitType,
      }) : super._internal();
    
      // 自定义工厂构造函数(可选)
      factory GaitPatient.create({
        String? id,
        required String name,
        required String family_name,
        required TemporalDate dob,
        required Gender gender,
        required double height_in_inches,
        List<Assessment>? Assessments,
        required String gaitType,
      }) {
        return GaitPatient(
          id: id ?? UUID.getUUID(),
          name: name,
          family_name: family_name,
          dob: dob,
          gender: gender,
          height_in_inches: height_in_inches,
          Assessments: Assessments != null ? List<Assessment>.unmodifiable(Assessments) : Assessments,
          gaitType: gaitType,
        );
      }
    }
    
  • 方案2:用组合替代继承
    不想受限于继承的构造函数约束时,可以把Patient实例作为子类的属性,这种方式更灵活,适配Amplify生成的不可变类。示例:

    class GaitPatient {
      final Patient patient;
      final String gaitType;
    
      GaitPatient({
        required this.patient,
        required this.gaitType,
      });
    
      // 快速创建方法
      factory GaitPatient.fromPatient(Patient patient, String gaitType) {
        return GaitPatient(patient: patient, gaitType: gaitType);
      }
    
      // 转发父类属性getter,方便外部访问
      String get name => patient.name;
      String get familyName => patient.family_name;
      // ... 按需转发其他属性
    }
    
  • 方案3:修改父类构造函数(谨慎操作)
    若有权修改Amplify生成的代码(注意:Amplify重新生成代码会覆盖修改),可以把默认工厂构造函数拆分为生成式构造函数加工厂方法:

    // 修改Patient类的构造函数
    Patient({
      String? id,
      required String name,
      required String family_name,
      required TemporalDate dob,
      required Gender gender,
      required double height_in_inches,
      List<Assessment>? Assessments,
    }) : this._internal(
            id: id ?? UUID.getUUID(),
            name: name,
            family_name: family_name,
            dob: dob,
            gender: gender,
            height_in_inches: height_in_inches,
            Assessments: Assessments != null ? List<Assessment>.unmodifiable(Assessments) : Assessments,
          );
    
    // 保留原逻辑为工厂方法(可选)
    factory Patient.create({
      String? id,
      required String name,
      required String family_name,
      required TemporalDate dob,
      required Gender gender,
      required double height_in_inches,
      List<Assessment>? Assessments,
    }) {
      return Patient(
        id: id,
        name: name,
        family_name: family_name,
        dob: dob,
        gender: gender,
        height_in_inches: height_in_inches,
        Assessments: Assessments,
      );
    }
    

    修改后子类可直接调用父类生成式构造函数,但需留意Amplify重新生成模型代码时会覆盖该修改,需重新调整。


内容的提问来源于stack exchange,提问作者C RICH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:04:03