Flutter入门-Dart语法4-函数和方法

301 阅读4分钟

基本原则: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
}