浅析Dart编程语言中的闭包概念

发表时间: 2021-12-20 16:12

闭包在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确实将函数视为一等公民,它对待函数有自己独一无二的方式。