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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:42:10