函数
Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。
- 函数声明
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;
- Dart中函数也可以作为变量,写法类似JavaScript中的函数表达式
var play = (str){
print(str);
};
play("玩得高兴");
- 函数作为参数传递
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也是很好用的一个东西,读者想深入了解的话可以去参考一个百度或官网。