内置函数
比如前面我们一直使用的print()方法就是Dart的内置方法。
自定义方法
语法
返回类型 方法名称(参数1,参数2,...){
方法体
return 返回值;
}
例如:
main() {
printName('hello Dart!');
print(getName());
}
//无返回值
void printName(String name) {
print(name);
}
//返回String类型
String getName() {
String name = 'hello Dart';
return name;
}
传参
一般用法
void printName(String name) {
print(name);
}
可选参数
有些老教程是这样的:
但是现在已经不支持这样写了,具体原因见 missing_default_value_for_parameter
新写法
//给定默认参数
void printName(String name,[int age=10]) {}
//可选
void printName(String name, [int? age]) {}
上面的这种是位置可选参数,参数的位置必须一致。还有一种是命名可选参数,命名可选参数位置不需要一致,例如
main() {
print(sayHello("张三", birthday: '1998-07-14'));
}
String sayHello(String name, {int age = 5, String? birthday}) {
return "${name},${age},${birthday}";
}
Dart 中实现一个把方法当做参数的方法
- 无参
main() {
test(say);
}
void test(Function foo) {
foo();
}
void say() {
print("无参");
}
- 有参,有返回值
main() {
test(add);
}
//要求test函数的参数必须是一个返回整形的函数
void test(int foo(int a, int b)) {
print(foo(1, 2));
}
int add(int a, int b) {
return a + b;
}
************************************************************************
//优化,方便阅读
main() {
test(add);
}
//类型定义
typedef Calculate = int Function(int a, int b);
//要求test函数的参数必须是一个返回整形的函数
void test(Calculate calculate) {
print(calculate(1, 2));
}
int add(int a, int b) {
return a + b;
}
匿名函数
main() {
() {
print("这是个匿名函数");
}();
}
把一个匿名方法赋值给变量
var a = () {
print("这是个匿名函数");
};
箭头函数
注:dart中的箭头函数式的匿名函数跟js中有很大区别,函数体中只能有一行代码
例如:
闭包
1、全局变量特点: 全局变量常驻内存、全局变量污染全局
2、局部变量的特点: 不常驻内存会被垃圾机制回收、不会污染全局
我们想实现的功能:
1.常驻内存
2.不污染全局
要实现上面功能就产生了闭包,闭包可以解决这个问题。
- 闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不会被系统回收(不会释放内存)
- 闭包的写法: 函数嵌套函数,并return 里面的函数,这样就形成了闭包。
示例
1、全局变量:常驻内存、全局变量污染全局
局部变量:不常驻内存会被垃圾机制回收、不会污染全局
闭包 常驻内存 不污染全局