Dart类继承构造器报错:无法在字段初始化器中访问this
Dart子类继承构造器传参问题解决
问题根源
- 第一个错误:Dart默认会让子类构造器调用父类的无参无名构造,但你的
ParentClass只有私有命名构造_,所以必须显式指定调用super._。 - 第二个错误:初始化列表(构造器冒号后面的部分)里,子类实例还没初始化完成,根本没法用
this访问成员,所以不能这么传值。
正确解决步骤
1. 删掉子类里重复的父类字段
ChildClass继承了ParentClass,已经拥有time和bar,完全没必要重复定义,这只会添乱。
2. 调整子类构造器,直接传参给父类
把time和bar作为子类构造器的参数,直接传递给super._,不需要用this——因为构造器的参数是局部变量,直接用参数名就行。
3. 修正工厂方法和序列化代码
对应删掉重复字段的引用,确保逻辑一致。
完整修正代码
@JsonSerializable(constructor: '_', fieldRename: FieldRename.snake) class ParentClass { final DateTime time; final String bar; ParentClass._({ required this.time, required this.bar, }); factory ParentClass.fromRecord(MyRecord record, String bar) { return ParentClass._( time: record.time.toUtc(), bar: bar, ); } factory ParentClass.fromJson(Map<String, dynamic> json) => _$ParentClassFromJson(json); Map<String, dynamic> toJson() => _$ParentClassToJson(this); } @JsonSerializable(constructor: '_', fieldRename: FieldRename.snake) class ChildClass extends ParentClass { final int id; // Dart 2.17+ 可以用super参数简写,更简洁 ChildClass._({ required super.time, required super.bar, required this.id, }) : super._(); // 如果你用的是低版本Dart,就用下面这种写法: // ChildClass._({ // required DateTime time, // required String bar, // required this.id, // }) : super._(time: time, bar: bar); factory ChildClass.fromRecord(MyRecord2 record, String bar) { return ChildClass._( id: record.id, time: record.time.toUtc(), bar: bar, ); } factory ChildClass.fromJson(Map<String, dynamic> json) => _$ChildClassFromJson(json); @override Map<String, dynamic> toJson() => _$ChildClassToJson(this); }
关键说明
- 低版本Dart不支持
super.time这种简写,就用参数传递的方式,直接把构造器里的time和bar传给super._,这里用的是构造器的局部参数,不是this的成员,所以完全合法。 - 子类继承的核心就是复用父类成员,重复定义字段违背了继承的设计逻辑,还会引发不必要的冲突。
内容的提问来源于stack exchange,提问作者stackoverflowing321
相关产品推荐
相关产品推荐

