Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。

    1. 函数声明

      1. bool isNoble(int atomicNumber) {
      2. return _nobleGases[atomicNumber] != null;
      3. }

      Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理,注意,函数返回值没有类型推断:

      1. typedef bool CALLBACK();
      2. //不指定返回类型,此时默认为dynamic,不是bool
      3. isNoble(int atomicNumber) {
      4. return _nobleGases[atomicNumber] != null;
      5. }
      6. void test(CALLBACK cb){
      7. print(cb());
      8. }
      9. //报错,isNoble不是bool类型
      10. test(isNoble);
    2. 对于只包含一个表达式的函数,可以使用简写语法

      1. bool isNoble (int atomicNumber)=> _nobleGases [ atomicNumber ] != null ;
    3. 函数作为变量

      1. var say = (str){
      2. print(str);
      3. };
      4. say("hi world");
    4. 函数作为参数传递

      1. void execute(var callback) {
      2. callback();
      3. }
      4. execute(() => print("xxx"))
    5. 可选的位置参数
      包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面:

      1. String say(String from, String msg, [String device]) {
      2. var result = '$from says $msg';
      3. if (device != null) {
      4. result = '$result with a $device';
      5. }
      6. return result;
      7. }

      下面是一个不带可选参数调用这个函数的例子:

      1. say('Bob', 'Howdy'); //结果是: Bob says Howdy

      下面是用第三个参数调用这个函数的例子:

      1. say('Bob', 'Howdy', 'smoke signal'); //结果是:Bob says Howdy with a smoke signal
    6. 可选的命名参数
      定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数。例如:

      1. //设置[bold]和[hidden]标志
      2. void enableFlags({bool bold, bool hidden}) {
      3. // ...
      4. }

      调用函数时,可以使用指定命名参数。例如:paramName: value

      1. enableFlags(bold: true, hidden: false);

      可选命名参数在Flutter中使用非常多。
      注意,不能同时使用可选的位置参数和可选的命名参数