[英]Dart class constructor with required arguments while not initializing formal
我在 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;
}
}
我怎樣才能使它需要構造函數參數,並且類參數不可為空,因此不需要任何空安全性? 我知道關鍵字required
,但據我了解,它僅適用於初始化正式的類構造函數。
我們如何為這個類使用初始化形式,尤其是在構造顏色類參數方面?
首先,您應該使用初始化列表來初始化字段,而不是在構造函數主體中進行賦值。 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;
}
此更改允許您的字段是最終的且不可為空,因為現在它們在被讀取之前已被初始化。 你的論點是必需的。 他們已經是,但他們仍然是。
如果你想使用初始化形式,你可以用 this.name 形式的參數替換this.name
this.name = name
(或name = name
,因為this
已經是可選的)形式的初始化列表條目:
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
參數不能是初始化形式,因為它不會將參數直接存儲到字段中。 只需將其保留為初始值設定項列表條目即可。
這是可行的,字段是最終的且不可為空,參數是必需的且不可為空,並且您可以在可能的情況下使用初始化形式。
你問了required
。 該修飾符適用於命名參數,並且您的參數是位置參數。 如果您希望它們被命名,您可以將其寫為:
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
的,命名參數默認是可選的。 您是否喜歡必需的命名參數是個人喜好問題。 有些人討厭寫和讀額外的名字,有些人更喜歡它,因為他們發現它更容易閱讀。 任何一個版本都有效。
要將參數設置為非 null,您必須將required添加到構造函數中的每個參數。
如果要初始化參數,可以調用該類並設置值。 您也可以在一些 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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.