如何在Dart命名工厂构造函数中初始化父类变量?
如何在Dart的工厂构造函数中初始化父类变量?
我来帮你搞定这个问题~ 在Dart里,工厂构造函数的本质是返回一个类的实例,它本身不会直接触发父类构造函数的调用。所以我们需要通过ClassB的常规构造函数来衔接,让它负责调用父类ClassA的构造函数,从而初始化父类的a和b变量。
先看你原来的代码问题:你的ClassB常规构造函数没有调用父类的构造函数,导致父类的a和b永远无法被初始化。我们只需要两步修改就能解决:
第一步:修改ClassB的常规构造函数,支持父类参数传递
更新ClassB的构造函数,让它接收父类需要的a和b参数,并通过super调用父类构造函数:
// 修改后的ClassB构造函数 ClassB({required this.c, required this.myList, super.a, super.b});
注:这里用了Dart 2.17+支持的
super参数简写语法。如果你使用的是更早版本的Dart,可以写成:ClassB({required this.c, required this.myList, this.a, this.b}) : super(a: a, b: b);
第二步:在工厂构造函数中传递父类参数
在fromJson工厂构造函数里,返回ClassB实例时,把JSON中的a和b字段也一并传进去:
factory ClassB.fromJson(json){ var list = json["list"] as List; // 简化List转换的写法,比forEach更高效 List<String> tempList = list.map((item) => item.toString()).toList(); return ClassB( c: json["c"], myList: tempList, a: json["a"], // 传递父类a的参数 b: json["b"] // 传递父类b的参数 ); }
完整的修改后代码
class ClassA{ final a; final b; ClassA({this.a, this.b}); } class ClassB extends ClassA{ final c; List <String> myList; ClassB({required this.c, required this.myList, super.a, super.b}); factory ClassB.fromJson(json){ var list = json["list"] as List; List<String> tempList = list.map((item) => item.toString()).toList(); return ClassB( c: json["c"], myList: tempList, a: json["a"], b: json["b"] ); } }
额外说明
如果你的JSON数据中可能不存在a或b字段,不用担心——因为ClassA的构造函数参数是可选的,只要保持ClassB构造函数中的super.a和super.b为可选(也就是去掉required),即使不传这些参数,父类的a和b会默认被初始化为null。
内容的提问来源于stack exchange,提问作者spongyboss
相关产品推荐
相关产品推荐

