functions函数,dart为面向对象语言,即使函数亦是对象,父类型为Function
1.闭包
1.1 返回值为函数对象
1.2 定义在外部函数内部,可理解为外部函数对象的内部成员方法,则可访问外部函数对象内定义的局部变量。所依赖的外部函数变量生命周期同自身生命周期。
/// Returns a function that adds [addBy] to the function's argument.
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// Create a function that adds 2.
var add2 = makeAdder(2);
// Create a function that adds 4.
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
2.当表达式一行时,可使用 => 语法
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
3.函数参数
参数分必须参数和可选参数,必须部分放在前面,可选放在后面。
可选参数分可选位置参数和可选命名参数,两种都可以有默认值,不提供默认值则为null
3.1 可选命名参数
使用 {param1, param2, …}定义可选命名参数。传入值时,可使用paramName:value
void enableFlags({bool bold, bool hidden}) {...}
enableFlags(bold: true, hidden: false);
@required关键字,表明该形参必传
const Scrollbar({Key key, @required Widget child})
设置默认值
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold will be true; hidden will be false.
enableFlags(bold: true);
3.2 可选位置参数
使用[]定义可选位置参数
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
调用示例
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
可使用默认list值和map值
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');
}
4.级联操作符..
使用..可对一个对象进行多次操作的调用
void main() {
querySelector('#sample_text_id')
..text = 'Click me!'
..onClick.listen(reverseText);
}
5.函数作为对象使用
函数可作为参数,传入另一个函数形参中
void printElement(int element) {
print(element);
}
var list = [1, 2, 3];
// Pass printElement as a parameter.
list.forEach(printElement);
可将函数赋值给变量
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
6.匿名函数
匿名函数,lambda或者闭包为无函数名的函数
匿名函数结构如下:
([[Type] param1[, …]]) {
codeBlock;
};
示例
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
当表达式只有一行时,可使用=>
list.forEach(
(item) => print('${list.indexOf(item)}: $item'));