flutter语言篇二

898 阅读2分钟

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'));