如何用不可为空的飞镖覆盖可为空的字段

How to override nullable field with non-nullable one dart

我有一个 class 和一个可为 null 的 属性。我想制作一个 superclass 用一个不可空的

覆盖 属性

所以

class Example {
String? name;
}

class NamedExample extends Example {
@override
String name;

}

有什么办法吗?如果不是,这个目标通常是如何实现的。

我基本上想要两个相同的 class,除了其中一个总是有一个 属性 而另一个是可选的。

这是 covariant 关键字的位置。通常用参数的子类型覆盖参数的类型是没有意义的,这样做是无效的。这个关键字告诉分析器这是有意的。它可以添加到超类或子类中。

子类:

class Example {
  String? name;
}

class NamedExample extends Example {
  @override
  covariant String name;
  
  NamedExample(this.name);
}

超类:

class Example {
  covariant String? name;
}

class NamedExample extends Example {
  @override
  String name;
  
  NamedExample(this.name);
}

你不能用 String name 覆盖 String? name 成员的原因是因为它可能违反基础 class 中 setter 的合同,因此可能不安全。基地 class 宣传:

var example = Example();
example.name = null;

是合法的。但是,如果 exampleNamedExample 的实例,则 example.name = null 赋值将不再合法。 covariant 关键字禁用此安全检查并相信您在实践中永远不会执行此类分配。

一般来说,你应该avoid overriding fields

如果您的 classes 只暴露一个 getter,您 可以 安全地覆盖。以下两个示例都是合法且安全的:

class Example {
  String? _optionalName;
  String? get name => _optionalName;
}

class NamedExample extends Example {
  NamedExample(this._requiredName);

  String _requiredName;

  @override
  String get name => _requiredName;
}

class Example {
  Example([this.name]);

  final String? name;
}

class NamedExample extends Example {
  NamedExample(this.name);

  @override
  final String name;
}