【问题标题】:flutter inheritance with null safety具有空安全性的颤振继承
【发布时间】:2021-09-22 16:09:39
【问题描述】:

我正在将我的颤振项目升级为空安全支持。在这个项目中,我有抽象模型类和继承。他们看起来像这样:

abstract class Technology {
  Guid id;
  String name;
  String description;
  String assetName;

  Technology();

  factory Technology.fromJson(Map<String, dynamic> json) =>
      TechnologyConverter().fromJson(json);

  Map<String, dynamic> toJson() => TechnologyConverter().toJson(this);
}
abstract class Research extends Technology {
  ResearchType researchType;

  Research();

  factory Research.fromJson(Map<String, dynamic> json) =>
      ResearchConverter().fromJson(json);
}
class LevelableResearch extends Research {
  LevelableResearch();

  factory LevelableResearch.fromJson(Map<String, dynamic> json) =>
      _$LevelableResearchFromJson(json);
  Map<String, dynamic> toJson() => _$LevelableResearchToJson(this);
}

build_runner 生成 json 序列化程序没有问题。 现在,当我更新为 null 安全时,我收到了很多错误,从 " 必须初始化不可为 null 的实例字段 'id'。尝试添加初始化表达式,或在此构造函数中添加字段初始化,或标记它'迟到'"

如果我在构造函数中初始化字段,我必须使用继承类中所有需要的字段调用 ": super()",这会导致编写过多。 正如错误所说,我可以用 late 标记它,但我不确定这是否应该这样做。

编写这些类的正确方法是什么,以便 build_runner 可以生成正确的 json 序列化器?

【问题讨论】:

    标签: json flutter dart jsonserializer dart-null-safety


    【解决方案1】:

    如果我在构造函数中初始化字段,我必须使用继承类中所有需要的字段调用 ": super()",这会导致编写过多。

    只有当你修改你的构造函数来接受所需的参数时,这才是正确的。必需的参数自然会阻止派生类的构造函数隐式调用super() 来构造基类。

    一般情况下(即,不是专门针对您正在使用的 JSON 反序列化库),如果您不想为基类构造函数提供必需的参数,那么您可以:

    • 通过构造函数的initializer list or by using inline field initializers 将成员初始化为非空默认值。

    • 标记成员late在您可以保证成员在被访问之前被初始化时才这样做。

    • 使成员可以为空。如果您随后在无条件访问成员的任何地方添加空断言 (!),这相当于您的代码在空安全之前所做的。 (或者添加正常失败的空检查。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多