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

Flutter父类子类构造器问题:无法访问父类变量

Flutter父类子类构造器参数传递问题解决

问题核心

你遇到的报错是因为子类TennisAttributes的构造函数没有声明userRating参数,导致在父类的fromJson方法中实例化子类时,无法传入userRating参数。父类UserSportAttributes的userRating是带默认值的可选参数,但子类构造器没有暴露该参数,也没有在调用super时传递对应值。

两种解决方案

方案一:让子类支持传入userRating参数

修改TennisAttributes的构造器,添加与父类一致的userRating(及可选的gamesPlayed)参数,并传递给父类构造:

class TennisAttributes extends UserSportAttributes {
  TennisAttributes({
    required int selfRating,
    required String description,
    int userRating = 0,
    int gamesPlayed = 0,
  }) : super(
          selfRating: selfRating,
          description: description,
          userRating: userRating,
          gamesPlayed: gamesPlayed,
        );
}

修改后,父类fromJson中的调用即可正常传入userRating:

static UserSportAttributes fromJson(Map<String, dynamic> json, String sportName) {
  if (sportName == "Tennis") {
    return TennisAttributes(
      selfRating: json['SelfRating'],
      userRating: json['UserRating'], // 不再报错
      description: json['Description'],
    );
  }
  // 其他运动类型的处理逻辑...
}

(注:给父类fromJson指定返回类型UserSportAttributes,能提升代码类型安全性)

方案二:子类不暴露userRating,沿用父类默认值

如果不需要外部给子类传入userRating,可以直接在父类fromJson中只传递子类构造器要求的参数,此时userRating会自动使用父类的默认值0:

static UserSportAttributes fromJson(Map<String, dynamic> json, String sportName) {
  if (sportName == "Tennis") {
    return TennisAttributes(
      selfRating: json['SelfRating'],
      description: json['Description'],
    );
  }
  // 其他运动类型的处理逻辑...
}

内容的提问来源于stack exchange,提问作者Jaime Ferreira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:30:58