2022年10月28日 星期五

Flutter學習-類別中建構子的寫法

 Function是提供程式中運作的地方,而建構式為與類別相同名稱的Function。

以下介紹建構子的一些基本寫法:

(一)參數為一般參數,參數前要加上類名,在class中宣告要先late延遲給予初始值

//利用延遲給與初始值
late String title;

//利用一般參數,裡面用this.參數=參數,將參數與class裡的變數對應
MyHomePage(String title){
this.title=title;
}

呼叫方法

MyHomePage('測試')

(二)參數為位置參數,參數外加上[],順序依排列順序,在呼叫時,可以利用null,給予空值
//利用Final宣告,因位置參數可空,因此宣告時在類型上要加上?
final String? title;
final int? counter;

//利用位置參數,裡面用this.參數=參數,將參數與class裡的變數對應
MyHomePage([this.title,this.counter]);

呼叫方法
MyHomePage('123',3),
或MyHomePage('123',null),

(三)參數為命名參數,參數外加{},可不依順序排列,呼叫時需加上命名,告知你在呼叫那個參數。
(1)第一種情況,參數前加上required,表示必給值
//利用Final宣告,若參數前有required表示必給值,不可空,不用加?
final String title;
final int counter;

//利用命名參數,裡面可用this.參數與class的變數對應
MyHomePage({required this.title,required this.counter});

呼叫方法
MyHomePage(title: '測試', counter: 3),

(2)第二種情況,參數前不加required,表示可不給值,因為可空,所以類別宣告時,類別名後需要加?
//利用Final宣告,若參數前有required表示必給值,不可空,不用加?
final String? title;
final int counter;

//利用命名參數,裡面可用this.參數與class的變數對應
const MyHomePage({this.title,required this.counter});

呼叫方法,同前
MyHomePage(title: '測試', counter: 3),
或是
MyHomePage(counter: 3),

其它,如要繼承父類別的參數值或方法,可使用super.參數,或在後面加上super(類:值)
MyHomePage({super.key, this.title,required this.counter});
或是:
MyHomePage({Key? key,this.title,required this.counter}):super(key: key);

如要對參數設定其它的限制,可使用assert設定限制的條件,如下列用法:
const MyHomePage({Key? key,this.title,required this.counter}):assert(counter>0),super(key: key);
若不符合assert條件,會在給值時,拋出例外訊息。如上面程式,若一開始給的counter大於0,就會拋出錯誤。

在非必要給值的參數,可先給預設值,如下:
MyHomePage({Key? key,this.title="預設值",required this.counter}):assert(counter<5,'counter要大於0'),super(key: key);


如果要進行初始化數值,可以於建構式初始化該值,並進行相關運算
ButtonPaint({required this.animation,required this.width,required this.height}):super(repaint: animation) {
final path = Path(); //初始化路徑
//使用呼叫給予的參數
rRect = RRect.fromRectAndRadius(
Rect.fromCenter(center: Offset.zero, width: width, height: height), const Radius.circular(16));
//將圓框矩形的路徑加入path
path.addRRect(rRect);
//取得路徑的相關資訊於pathMetric
pathMetric=path.computeMetrics().single;
}


沒有留言:

張貼留言