Functions 函数(方法)
在Dart语言,函数是物件也是一种叫做Function的型态(type)。因此,Function可以当成变数,也可以当做其他函数的参数;另外亦可把类别(class)的实体(instance)当做函数来呼叫。
建议为每个函数的参数以及回传值都指定类型。
定义
//定义一个函数 判断清单对应参数是否为nullbool isNoble(int atomicNumber) {return list[atomicNumber] != null;}
对于只有一个表达式的方法,可以选择使用缩写语法来定义
//定义一个函数 判断清单对应参数是否为null 缩写写法bool isNoble(int atomicNumber) => list[atomicNumber] != null;
=> 胖箭头: 简写语法用于仅包含一句表达式的函数。这个语法特别是在将匿名函数作为参数传递时非常有用。
且在 => 与 ; 之间的只能是表达式,而非语句。例如你不能将一个 if语句 放在其中,但是可以放置条件表达式(condition ? expr1 : expr2)。
参数
有两种类型的参数:必需和可选的。
必需的参数在参数列表前面,可选参数则是放置于必需参数的后面。
可选参数
可选参数分为命名参数和位置参数,可在参数列表中任选其一使用,但两者不能同时出现在参数列表中。
命名参数
定义函数时,使用 {param1, param2, …} 来指定命名参数
void enableFlags({bool bold, bool hidden}) {...}
当你呼叫函数时,可以使用 参数名: 参数值 的形式来指定命名参数。:例如:
enableFlags(bold: true, hidden: false);
虽然命名参数是可选参数的一种,但是你仍然可以使用 @required 注解来标识一个命名参数是必须的参数,此时呼叫程式则必须为该参数提供一个值。例如:
const Scrollbar({Key key, @required Widget child})
如果想要使用 Scrollbar 的建构式产生一个 Scrollbar 物件而不提供 child 这个参数,则会导致编译错误。
@required 注解定义在 meta 套件中,可以直接导入 package:meta/meta.dart 使用。
位置参数
使用 [] 将一系列参数包裹起来作为位置参数:
String say(String from, String msg, [String device]) { var result = '$from says $msg'; if (device != null) { result = '$result with a $device'; } return result;}
下面是不使用可选参数呼叫say函数的例子
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
下面是使用可选参数呼叫say函数的例子
assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');
预设参数值
可以用 = 为函数的命名和位置参数定义预设值,预设值必须为编译时常量,没有指定预设值的情况下预设值为 null。
void main() { 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 同样也可以作为预设值。下面的範例定义了一个 doStuff() 的函数,其中的参数 list 和 gifts 指定了一个 List 类型的值和 Map 类型的值。
void main() { var list1 = [4,5,6]; var map1 = {'first':'one','second':'two','third':'three'}; 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'); } doStuff(); doStuff(list:list1,gifts: map1);}
综合範例
引用 IT人
//num a, num b, num c, num d 最普通的传参: 呼叫时,引数个数和引数顺序必须固定add1(num a, num b, num c, num d) { print(a + b + c + d);}//[num a, num b, num c, num d]传参: 呼叫时,引数个数不固定,但是引数顺序需要一一对应, 不支援命名引数add2([num a, num b, num c, num d]) { print(a + b + c + d);}//{num a, num b, num c, num d}传参: 呼叫时,引数个数不固定,引数顺序也可以不固定,支援命名引数,也叫可选引数,是dart中的一大特性,这就是为啥Flutter程式码那么多可选属性,大量使用可选引数add3({num a, num b, num c, num d}) { print(a + b + c + d);}//num a, num b, {num c, num d}传参: 呼叫时,a,b引数个数固定顺序固定,c,d引数个数和顺序也可以不固定add4(num a, num b, {num c, num d}) { print(a + b + c + d);}main() { add1(100, 100, 100, 100); //最普通的传参: 呼叫时,引数个数和引数顺序必须固定 add2(100, 100); //呼叫时,引数个数不固定,但是引数顺序需要一一对应, 不支援命名引数(也就意味着顺序不变) add3( b: 200, a: 200, c: 100, d: 100); //呼叫时,引数个数不固定,引数顺序也可以不固定,支援命名引数(也就意味着顺序可变) add4(100, 100, d: 100, c: 100); //呼叫时,a,b引数个数固定顺序笃定,c,d引数个数和顺序也可以不固定}
add3({num a, num b, num c, num d = 100}) {//d就是预设值引数,给的预设值是100 print(a + b + c + d); //1200}main() { add3(b: 200, a: 100, c: 800);}
main() { Function square = (a) { return a * a; }; Function square2 = (a) { return a * a * a; }; print(add(3, 4, square, square2)); //9+64=73}num add(num a, num b, [Function op, Function op2]) { //函式作为引数传递 return op(a) + op2(b);}
main() 函数
每个程式都必须有一个 main() 函数作为入口,main() 函数回传值为 void 并且有一个 List <String
> 类型的可选参数。
void main(List<String> arguments) { print(arguments); print(arguments.length); print(arguments[1]);}
匿名函数
没有名字的函数,称之为 匿名函数,或 Lambda表达式 或 Closure闭包。
你可以将一个变数设为匿名函数,然后使用它,亦可将该变数添加到集合或从中删除。
匿名函数看起来与命名函数类似,在括号之间可以定义参数,参数之间用逗号分割;后面大括号中的内容则为函数体:
([[类型] 参数[, …]]) {
函数体;
};
void main() { var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!'; print(loudify('hello')); //!!! HELLO !!!}
void main() { var list = ['apples', 'bananas', 'oranges']; list.forEach((item) { print('${list.indexOf(item)}: $item'); });}
支援闭包(closure)
函数可以封闭定义到它範畴(scope)内的变数。接下来的範例中,函数 makeAdder() 设定了变数 addBy。无论函数在什么时候return,它都可以使用设定的 addBy 变数。
Function makeAdder(int addBy) { return (int i) => addBy + i;}void main() { // 生成加 2 的函数。 var add2 = makeAdder(2); // 生成加 4 的函数。 var add4 = makeAdder(4); print(add2(3)); //5 print(add4(3)); //7}