基本原则:Dart 是一门真正面向对象的语言,甚至其中的函数也是对象,并且有它自己的类型
Function。这也意味着函数可以被赋值给变量或者作为参数传递给其他函数。也可以把Dart类的实例当作方法来调用
函数声明
bool isPositiveInteger(int num) {
return num > 0;
}
//箭头函数简写
bool isPositiveInteger(int num) => num > 0;
=> expr语法是{ return expr; }的简写。=>符号 有时也被称为 箭头 语法
匿名函数
void main() {
// 作为函数参数传递
performOperation((a, b) {
print(a + b);
});
// 与forEach方法结合使用
List<int> numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) {
print(number * 2);
});
// 捕获外部变量
var multiplier = 2;
var doubler = (int number) => number * multiplier;
print(doubler(5)); // 输出: 10
}
高阶函数
函数作为参数
// 打印消息的函数
void printMessage(String message) {
print(message);
}
// 高阶函数,接受一个函数作为参数并调用它
void higherOrderFunction(void Function(String) callback) {
callback('你好,世界!');
}
void main() {
higherOrderFunction(printMessage); // 将printMessage函数作为参数传递
}
函数作为返回值
// 返回一个函数,该函数将传入的参数与x相加
Function adder(int x) {
return (int y) => x + y;
}
void main() {
var addTwo = adder(2); // 返回一个将传入的参数与2相加的函数
print(addTwo(3)); // 输出:5,将3作为参数传递给addTwo函数
}
词法作用域闭包
和js中类似,dart中函数也具有词法作用域和闭包的特性 词法作用域简单说变量的作用域在编写代码的时候就已经确定了 闭包是指一个函数对象,它可以访问和操作其定义范围之外的变量,即使在其定义之后使用,这种能力被称为"捕获"外部变量。在Dart中,闭包具有以下特点和应用场景:
访问外部变量:闭包可以捕获和访问其定义范围之外的变量,即使在其定义之后使用,仍然可以引用和操作外部变量的值。
保留状态:闭包可以在函数执行完毕后保留其内部变量的状态,从而实现状态的持久化
void main() {
// 捕获外部变量
Function createMultiplier(int multiplier) {
return (int number) => number * multiplier;
}
var doubler = createMultiplier(2);
print(doubler(5)); // 输出: 10
// 保留状态
Function counter() {
int count = 0;
return () {
count++;
print(count);
};
}
var increment = counter();
increment(); // 输出: 1
increment(); // 输出: 2
}
函数参数
命名可选参数
使用命名参数可忽略参数的顺序,在调用时候非常方便,尤其是参数多的情况,调用时用参数名称和参数值同时出现的方法,同时提高代码的可读性。
定义函数是使用 { param1, param2, ... }来指定命名参数:
void enableFlags({bool bold, bool hidden}) {...}
//调用函数时,可以使用指定命名参数 paramName: value。 例如:
enableFlags(bold: true, hidden: false);
//使用 @required 注释表示参数是 required 性质的命名参数:
const Scrollbar({Key key, @required Widget child});
//此时 Scrollbar 是一个构造函数, 当 child 参数缺少时,分析器会提示错误。
位置可选参数
包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面:
String say(String from, String msg, [String? device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
print(result);
return result;
}
say('Bob', 'Howdy'); // 结果是: Bob says Howdy
say('Bob', 'Howdy', 'smoke signal'); // 结果是:Bob says Howdy with a smoke signal
默认参数值
在定义方法的时候,可以使用 = 来定义可选参数的默认值。 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null
方法
简单理解,属于类的函数就是方法了
实例方法
实例方法是属于类的函数,必须通过类的实例来调用
// 实例方法示例
class Calculator {
int add(int a, int b) {
return a + b;
}
}
void main() {
var calculator = Calculator();
print(calculator.add(3, 5)); // 输出: 8
}
静态方法
静态方法是属于类本身的函数,可以直接通过类名调用,而无需创建类的实例。和Java类似,静态方法中无法访问实例属性,实例方法中可以访问静态属性。
// 静态方法示例
class Calculator {
static int add(int a, int b) {
return a + b;
}
}
void main() {
print(Calculator.add(3, 5)); // 输出: 8
}