如何解决具有空安全性的颤振继承
我正在将我的 Flutter 项目升级到 null 安全支持。在这个项目中,我有抽象模型类和继承。他们看起来像这样:
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 序列化程序没有问题。 现在,当我更新为空安全时,我收到了很多错误,从 "Non-nullable instance field 'id' must be initialized 开始。尝试添加一个初始化表达式,或者在这个构造函数中添加一个字段初始化,或者标记'晚'"
如果我在构造函数中初始化字段,我必须使用继承类中所有需要的字段调用 ": super()" ,这会导致写入过多。 正如错误所说,我可以用 late 标记它,但我不确定是否应该这样做。
编写这些类的正确方法是什么,以便 build_runner 可以生成正确的 json 序列化程序?
解决方法
如果我在构造函数中初始化字段,我必须使用继承类中所有需要的字段调用 ": super()" ,这会导致写入过多。
仅当您修改构造函数以采用必需的参数时,这才是正确的。必需参数自然会阻止派生类的构造函数隐式调用 super()
来构造基类。
一般来说(即,不是专门针对您正在使用的 JSON 反序列化库),如果您不想为基类构造函数提供必需的参数,那么您可以:
-
通过构造函数的 initializer list or by using inline field initializers 将成员初始化为非空默认值。
-
标记成员
late
。 仅这样做,前提是您可以保证在访问成员之前对其进行初始化。 -
使成员可以为空。如果您随后在无条件访问成员的任何地方添加空断言 (
!
),这与您的代码在空安全之前所做的等效。 (或者添加正常失败的空检查。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。