定义的方法:
print1() {
print('object');
return 'd';
}
不加括号就是传递方法
GestureDetector(
onTap: logic.print1,
child: Text('点击测试'),
),
此时控制台会输出
///object
加了括号就是返回值
GestureDetector(
onTap: logic.print1(), //加了括号就是返回 值----->
child: Text('点击测试'),
),
控制台报错: type 'String' is not a subtype of type '(() => void)?
注意: 不加括号就是传递方法,方法是一个对象的实例,可以传递给变量。 加括号就是调用这个方法。方法的返回值,可有可无。 在dart语言中,所有都是对象,所以可以被变量引用。
比如上面的例子中:
如果这样的话,logic.print1(),logic.print1()并将结果传递给onTap,这个是一个常见的错误。这个是对logic.print1的引用,而不是调用他。 一般onTap,会采用这样的方式:来创建闭包或内联函数 。
- ()=>expression
- (){ statements }
通过这样的方式,创建内联函数、该函数作为参数传递,在事件onTap点击的时候,传递进去。 statements 和expression ,具有创建他们的context,并且可以访问和使用context中,可用的所有成员和标识符(变量、方法、函数、typedef等
总结:
- 加括号,logic.print1(),直接调用方法,目的是直接获取方法的返回值,利用返回值来实现业务逻辑。
- 不加,间接调用方法,把该方法作为参数传递过去,在调用者其内部,调用该方法。
其实,
onTap: logic.print1
onTap:()=> logic.print1()
两种方式并没有区别,都可以创建出print1()(argument type function) ,
参考:
What does the empty parentheses after the onPressed property mean in Dart?
|