Dart是一个面向对象的语言,所有的函数都是一个Function类型(即:dart中所有函数都是Function类的对象/实例)。
声明函数时,使用花括号{param1,param2}的方式来指定命名参数。如果不指定默认值或required,参数值为null。
使用命名参数方式声明的函数,在函数调用时,其命名参数是可选的,除非该参数使用required修饰。
// 函数声明
// 命名参数,使用花括号 {} 包裹参数列表,调用时需要指定参数名称。bold为必填参数,width默认值为0。
void enableFlags(int flags,{required bool? bold, bool? hidden,int? width = 0}) {
print("flags: $flags, bold: $bold, hidden: $hidden, width: $width");
}
// 函数调用
enableFlags(1,bold:false); // 输出:flags: 1, bold: false, hidden: null, width: 0
enableFlags(1,bold:true); // 输出:flags: 1, bold: true, hidden: null, width: 0
enableFlags(1,bold:true,hidden:false); // 输出:flags: 1, bold: true, hidden: null, width: 0
enableFlags(1,hidden:false,bold:true); // 输出:flags: 1, bold: true, hidden: null, width: 0int flags 为普通参数,值为必传,否则编译器报错参数不匹配。
命名参数的必须书写参数名(即:bold、hidden不可省略),这就是为什么这种方式被称为命名参数,变量的赋值以名称为准,不以位置。
命名参数的赋值,以参数的名称为准,所以函数调用时书写顺序可以与函数的声明不一致(即:调用函数时,bold、hidden的先后顺序不影响结果)。
未提供默认值的命名参数,其类型必须是可为空(nullable、类型后面带?) 且 默认值为null。
如果希望某个命名参数必填,则使用required声明。
bool? 表示该变量可能为null。
声明函数时,使用中括号[param1,param2]的方式来指定可选位置参数。如果不指定默认值,参数的默认值为null。
由于是可选位置参数,所以可选位置参数不可使用required修饰,否则与可选相违背。
// 函数声明
// 可选位置参数,使用方括号 [] 包裹参数列表,调用时不需要指定参数名称。
void enableFlagsOptional(int flags, [bool? bold = false, bool? hidden]) {
print(
"flags: $flags, bold: $bold, hidden: $hidden",
);
}
// 函数调用
enableFlagsOptional(1); // flags: 1, bold: false, hidden: null
enableFlagsOptional(1, true); // flags: 1, bold: true, hidden: null
enableFlagsOptional(1, true, false); // flags: 1, bold: true, hidden: falseint flags 为普通参数,值为必传,否则编译器报错参数不匹配。
可选位置参数以位置来区分参数变量。比如在示例代码中,函数调用时,参数的第二个位置永远是bold,第三个位置永远是hidden 。
同一函数中,命名参数与可选位置参数不可同时使用。
在函数参数少,使用简单的场景中使用可选位置参数,其它情况使用命名参数。
每个程序都必须有且仅有一个主函数main ,主函数为程序的执行入口。
// 主函数/入口函数
void main(List<String> arguments) {
print(arguments);
assert(arguments.length == 2);
assert(int.parse(arguments[0]) == 1);
assert(arguments[1] == 'test');
}其中List<String> arguments为接收命令行参数时使用,如果不需要接收参数,可以使用void main(){}声明main函数。
函数既然是Function类的实例,那么函数就可以像普通变量一样使用,比如作为参数传递给函数、赋值给变量。