Dart/Flutter中的Tear off "分离"

更新时间:2023-10-29 22:02
首先引用dart文档中的定义


当您引用函数、方法或命名构造函数但省略 括号中,Dart 创建了一个 tear-off 一个接受与函数相同的参数并在你调用它时调用底层函数的闭包。如果你只需要一个接受与闭包相同参数的命名函数的闭包,不要手动地将调用包装在lambda(匿名函数)中。



如果定义看起来很复杂,让我尝试用其他词来表达。 基本上, tear-off 是一种直接使用函数作为参数而不使用任何不必要的 lambda(匿名函数)的机制。

举个栗子:



var charCodes = [68, 97, 114, 116];
var buffer = StringBuffer();

// Function:
charCodes.forEach((code) {
  print(code);
});

// Method:
charCodes.forEach((code) {
  buffer.write(code);
});

// Named constructor:
var strings = charCodes.map((code) => String.fromCharCode(code));

// Unnamed constructor:
var buffers = charCodes.map((code) => StringBuffer(code));

改为



var charCodes = [68, 97, 114, 116];
var buffer = StringBuffer();

// Function:
charCodes.forEach(print);

// Method:
charCodes.forEach(buffer.write);

// Named constructor:
var strings = charCodes.map(String.fromCharCode);

// Unnamed constructor:
var buffers = charCodes.map(StringBuffer.new);

从Dart≥2.15开始,Class构造函数也支持tear-off


改为:

Future<void> main() async {
  final testManager = TestManager(Test.fromName);
}

另外一种应用:
class Adder {
  int add(int a, int b) {
    return a + b;
  }
}

void main() {
  var adder = Adder();
  var addMethod = adder.add;
  print(addMethod(10, 20));
  print(adder.add.call(10,20));
}
在这个示例中,我们首先创建了一个名为 Adder 的类,该类有一个 add 方法可以将两个数相加。然后,在 main 函数中,我们创建了一个 Adder 对象,并将其 add 方法存储在 addMethod 变量中。这就把 add 方法从 adder 对象中"分离"出来,之后你可以像普通函数一样使用 addMethod。
这就是Dart中"tear off"的一个典型用例,即把一个方法或函数从其源对象中分离出来,并保存在一个变量中单独使用。
 

总结:

tear-off 基本上是一种使我们能够灵活地编写更少代码的方法。 因此,一旦您看到此 lint 错误(如果启用了 lint),只需使用 tear-off 来缩短代码。
以变量的形式存储类的方法或函数,然后可以作为参数来使用或者在其他地方调用。这就像是把方法从它的类或者对象中“分离”出来,从而可以单独地处理和使用。