簡體   English   中英

帶有所需參數的 Dart 類構造函數,而不是初始化形式

[英]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;
  }
}
  1. 我怎樣才能使它需要構造函數參數,並且類參數不可為空,因此不需要任何空安全性? 我知道關鍵字required ,但據我了解,它僅適用於初始化正式的類構造函數。

  2. 我們如何為這個類使用初始化形式,尤其是在構造顏色類參數方面?

首先,您應該使用初始化列表來初始化字段,而不是在構造函數主體中進行賦值。 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的,命名參數默認是可選的。 您是否喜歡必需的命名參數是個人喜好問題。 有些人討厭寫和讀額外的名字,有些人更喜歡它,因為他們發現它更容易閱讀。 任何一個版本都有效。

  1. 要將參數設置為非 null,您必須將required添加到構造函數中的每個參數。

  2. 如果要初始化參數,可以調用該類並設置值。 您也可以在一些 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM