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;
}
}
我怎样才能做到需要构造函数参数,并且 class 参数不可为 null,因此不需要任何 null 安全性?我知道关键字 required
,但据我所知,它仅适用于初始化正式的 class 构造函数。
我们如何为这个 class 使用初始化形式,尤其是关于构造颜色 class 参数?
要将参数设置为 non-null,您必须将 required 添加到构造函数中的每个参数。
如果要初始化参数,可以调用 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
,命名参数默认为可选。
您是否喜欢必需的命名参数是个人喜好问题。有些人讨厌写和读额外的名字,有些人喜欢它,因为他们觉得它更容易阅读。
两个版本都可以。
我有以下基本 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;
}
}
我怎样才能做到需要构造函数参数,并且 class 参数不可为 null,因此不需要任何 null 安全性?我知道关键字
required
,但据我所知,它仅适用于初始化正式的 class 构造函数。我们如何为这个 class 使用初始化形式,尤其是关于构造颜色 class 参数?
要将参数设置为 non-null,您必须将 required 添加到构造函数中的每个参数。
如果要初始化参数,可以调用 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
,命名参数默认为可选。
您是否喜欢必需的命名参数是个人喜好问题。有些人讨厌写和读额外的名字,有些人喜欢它,因为他们觉得它更容易阅读。
两个版本都可以。