浅学一下Dart语法--二

113 阅读3分钟

函数

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

  1. 函数声明 String isString(Dynamic a){ return a == String ; }

Dart的函数声明默认返回值是dynamic,所以当没有显示声明类型时,默认就是dynamic,而且值得注意的是返回值没有类型推断。

`

typedef bool CALLBACK();

//不指定返回类型,此时默认为dynamic,不是bool
isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

void demo(CALLBACK cb){
   print(cb()); 
}
//报错,isNoble不是bool类型
demo(isNoble);

`

如果函数只包含一个表达式,则可以使用简写语法,类似JavaScript中的箭头函数

String isString(String val) => val;
  1. Dart中函数也可以作为变量,写法类似JavaScript中的函数表达式
var play = (str){
    print(str);
};
play("玩得高兴");
  1. 函数作为参数传递
void demo(var callback) {
    callback();
}
demo(() => print("执行了回调函数"))
  • 可选的位置参数 使用 []来标记为可选择的位置参数,而且该可选位置参数必须位于参数列表的最后面
String say(String from, String msg, [String? device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

不带可选参数调用这个函数的例子:

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

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

say('Bob', 'Howdy', 'smoke signal'); //结果是:Bob says Howdy with a smoke signal
  • 可选择的命名参数 使用{param1, param2, …}来定义可选择的命名参数,而且也必须放在参数列表的最后面,用于指定命名参数
//设置[bold]和[hidden]标志
void enableFlags({bool bold, bool hidden}) {
    // ... 
}

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

enableFlags(bold: true, hidden: false);

可选命名参数在Flutter中使用非常多。但是有一点需要注意的是,不能同时使用可选的位置参数和可选的命名参数

mixin

Dart本身是不支持多继承的,所以通过mixin来组合多个类

class Person {
  say() {
    print('say');
  }
}

mixin Eat {
  eat() {
    print('eat');
  }
}

mixin Walk {
  walk() {
    print('walk');
  }
}

mixin Code {
  code() {
    print('key');
  }
}

class Dog with Eat, Walk{}
class Man extends Person with Eat, Walk, Code{}

上面的示例中,我们定义了Eat、Walk、Code这三个mixin,然后通过with关键字把他们组合成了不同的类。

使用mixin的时候,有一点需要注意的,如果有多个mixin中有相同名字的方法时,默认是使用最后面的mixin内的方法。当然mixin方法中也可以通过super关键字来调用之前的mixin或类中的方法。


这篇就介绍了Dart语法中的函数跟mixin,其实函数还有其他很多的用法,但具体还得在业务中才能使用的到,这里就不介绍太多了。而mixin也是很好用的一个东西,读者想深入了解的话可以去参考一个百度或官网。