扩展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:直接调用父类私有构造函数
_internalPatient类内置了私有的生成式构造函数_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
相关产品推荐
相关产品推荐

