可選參數(shù)可以是命名參數(shù)或者位置參數(shù),但一個(gè)參數(shù)只能選擇其中一種方式修飾。
調(diào)用函數(shù)時(shí),可以使用指定命名參數(shù) paramName: value。 例如:
enableFlags(bold: true, hidden: false);
定義函數(shù)是,使用 {param1, param2, …} 來指定命名參數(shù):
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {...}
Flutter 創(chuàng)建實(shí)例的表達(dá)式可能很復(fù)雜, 因此窗口小部件構(gòu)造函數(shù)僅使用命名參數(shù)。 這樣創(chuàng)建實(shí)例的表達(dá)式更易于閱讀。
使用 @required 注釋表示參數(shù)是 required 性質(zhì)的命名參數(shù), 該方式可以在任何 Dart 代碼中使用(不僅僅是Flutter)。
const Scrollbar({Key key, @required Widget child})
此時(shí) Scrollbar 是一個(gè)構(gòu)造函數(shù), 當(dāng) child 參數(shù)缺少時(shí),分析器會(huì)提示錯(cuò)誤。
Required 被定義在 meta package。 無論是直接引入(import) package:meta/meta.dart ,或者引入了其他 package,而這個(gè) package 輸出(export)了 meta,比如 Flutter 的 package:flutter/material.dart。
將參數(shù)放到 [] 中來標(biāo)記參數(shù)是可選的:
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
下面是不使用可選參數(shù)調(diào)用上面方法 的示例:
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
下面是使用可選參數(shù)調(diào)用上面方法的示例:
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
在定義方法的時(shí)候,可以使用 = 來定義可選參數(shù)的默認(rèn)值。 默認(rèn)值只能是編譯時(shí)常量。 如果沒有提供默認(rèn)值,則默認(rèn)值為 null。
下面是設(shè)置可選參數(shù)默認(rèn)值示例:
/// 設(shè)置 [bold] 和 [hidden] 標(biāo)志 ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold 值為 true; hidden 值為 false.
enableFlags(bold: true);
不推薦: 舊版本代碼中可能使用的是冒號(hào) (:) 而不是 = 來設(shè)置參數(shù)默認(rèn)值。 原因是起初命名參數(shù)只支持 : 。 這種支持可能會(huì)被棄用。 建議 使用 = 指定默認(rèn)值。
下面示例演示了如何為位置參數(shù)設(shè)置默認(rèn)值:
String say(String from, String msg,
[String device = 'carrier pigeon', String mood]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
assert(say('Bob', 'Howdy') ==
'Bob says Howdy with a carrier pigeon');
list 或 map 可以作為默認(rèn)值傳遞。 下面的示例定義了一個(gè)方法 doStuff(), 并分別指定參數(shù) list 和 gifts 的默認(rèn)值。
void doStuff(
{List<int> list = const [1, 2, 3],
Map<String, String> gifts = const {
'first': 'paper',
'second': 'cotton',
'third': 'leather'
}}) {
print('list: $list');
print('gifts: $gifts');
}
更多建議: