闭包在javascrip中很常用,但Dart中的闭包有什么不一样的地方?让我们看例子。
例一:
这是Flutter的一个手势操作组件,在上述代码中,onTap是什么数据类型?它是void Function()类型,一个函数。但是,当打开GestureDetector这个函数时,onTap又是"GestureTapCallback“类型,也是一个函数。
上述函数在Dart中如何运作,我们如何将函数存储在变量中?很简单,这就是闭包的概念。闭包,又称为一等函数,它的基本思想是:一个函数也是一个可以作为参数传递给其他函数的值,闭包可以保存到变量中并用作其它函数的参数。在Dart中,闭包最重要的用途是定义回调。如上例中GestureDetector中的onTap就是闭包。
使用闭包最简单的方法是调用typedef关键字,让我们为函数定义一个别名。
例二:
要注意的是:Function是Dart中所有函数类型的超类。现在,我们可以在下面函数中使用这个别名SomeFunction
例三:
那么,我们如何调用上面这个函数calculateArea?我们可以用下面的代码:
例四:
上例中,我们传递了一个匿名函数(使用箭头函数=>)作为参数,该函数返回值为10。然后,在函数calculateArea中, 该匿名函数被了调用两次,返回两次10的积即100再乘以3.14(见例三),这就是Dart中闭包的工作方式。现在让我们回头去看看GestureDetector手势组件。
例五:
如果查询onTap属性的定义,我们会看到类似上面的属性。如果再打开GestureTapCallback属性的定义,我们会又看到下面的提示:
例六:
结论:Dart最神奇的地方在于:你可以声明一个Object类型的变量,并直接将它设置为一个Function的实例。这一点甚至F#和C#都无法做到,这也是我们喜欢Dart的地方,Dart确实将函数视为一等公民,它对待函数有自己独一无二的方式。