Dart class 具有必需参数的构造函数,但未初始化正式

Dart class constructor with required arguments while not initializing formal

我有以下基本 class 及其在 Dart 中的构造函数:

class ChartData {
  String? name;
  Color? color;
  Duration? duration;
  ChartData(
      String name, List rgbo, Duration duration) {
    this.name = name;
    this.color = Color.fromRGBO(rgbo[0], rgbo[1], rgbo[2], rgbo[3]);
    this.duration = duration;
  }
}
  1. 我怎样才能做到需要构造函数参数,并且 class 参数不可为 null,因此不需要任何 null 安全性?我知道关键字 required,但据我所知,它仅适用于初始化正式的 class 构造函数。

  2. 我们如何为这个 class 使用初始化形式,尤其是关于构造颜色 class 参数?

  1. 要将参数设置为 non-null,您必须将 required 添加到构造函数中的每个参数。

  2. 如果要初始化参数,可以调用 class 并设置值。你也可以初始化一些 initState()

例如:

class ChartData {
    String name;
    Color color;
    Duration duration;

  ChartData({
    required this.name,
    required this.color,
    required this.duration
});
}

class OtherClass extends StatelessWidget {

  //initialize
  final chartData = ChartData(
      name: "name1",
      color: Color.fromRGBO(38, 38, 38, 0.4),
      duration: const Duration(seconds:15));

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

首先,您应该使用初始化列表来初始化字段,而不是在构造函数体中进行赋值。在这方面,Dart 就像 C++,而不是 Java.

class ChartData {
  final String name;
  final Color color;
  final Duration duration;
  ChartData(String name, List<int> rgbo, Duration duration)
      : this.name = name,
        this.color = Color.fromRGBO(rgbo[0], rgbo[1], rgbo[2], rgbo[3]),
        this.duration = duration;
  
}

此更改允许您的字段成为最终字段 non-nullable,因为现在它们在被读取之前就已初始化。你的论点是必需的。他们已经是,但他们仍然是。

如果你想使用初始化形式,你可以替换 this.name = name(或 name = name 形式的初始化列表条目,因为 this 已经是可选的) 具有 this.name:

形式的参数
class ChartData {
  final String name;
  final Color color;
  final Duration duration;
  ChartData(this.name, List<int> rgbo, this.duration)
      : color = Color.fromRGBO(rgbo[0], rgbo[1], rgbo[2], rgbo[3]);
}

color 参数不能是初始化形式,因为它不会将参数直接存储到字段中。只需将其保留为初始化列表条目即可。

这有效,字段是最终字段 non-nullable,参数是必需的并且 non-nullable,并且尽可能使用初始化形式。

您问的是 required。该修饰符适用于 named 参数,并且您的参数是位置参数。 如果你想让它们被命名,你可以写成:

class ChartData {
  final String name;
  final Color color;
  final Duration duration;
  ChartData(
      {required this.name, required List<int> rgbo, required this.duration})
      : color = Color.fromRGBO(rgbo[0], rgbo[1], rgbo[2], rgbo[3]);
}

参数周围的 {...} 使它们命名。必需的命名参数前面需要一个 required ,命名参数默认为可选。 您是否喜欢必需的命名参数是个人喜好问题。有些人讨厌写和读额外的名字,有些人喜欢它,因为他们觉得它更容易阅读。 两个版本都可以。