Dart 中 onPressed 属性后面的空括号是啥意思?

Posted

技术标签:

【中文标题】Dart 中 onPressed 属性后面的空括号是啥意思?【英文标题】:What does the empty parentheses after the onPressed property mean in Dart?Dart 中 onPressed 属性后面的空括号是什么意思? 【发布时间】:2019-02-23 12:44:18 【问题描述】:

我知道在onPressedonTap 之后为小部件调用函数的语法。有两个选项我们可以使用() => function()() function(); 语法。空括号是什么意思?

【问题讨论】:

你也可以使用onTap: function 【参考方案1】:

() => expression() statements 创建闭包或内联函数。

通过这种方式,您可以创建内联函数,该函数作为参数传递,以便在您传递给它的小部件发生onPressed 事件时调用。

expressionstatements 具有可用的创建它们的上下文,并且可以访问和使用该上下文中可用的所有成员和标识符(变量、方法、函数、typedef...)。

如果你使用

onPressed: myFunction 传递了对现有函数的引用。 这仅在onPressedmyFunction 预期的回调参数兼容时才有效。 onPressed: myFunction() myFunction() 被执行并将返回的结果传递给onPressed。这是一个常见的错误,当实际上是为了传递对myFunction 的引用而不是调用它时,无意中犯了这个错误。

【讨论】:

您能详细解释一下 onPressed: myFunction 和 onPressed: myFunction() 之间的区别吗?我到现在都赶不上。谢谢你。 只有一个区别。 onPressed: myFunction 将函数myFunction 的引用(指针)传递给onPressed 参数。额外的() 导致myFunction 被执行,myFunction()返回值 被传递给onPressed,这通常不是你想要的。 感谢@GünterZöchbauer 帮助解答了这么多 SOF 问题!【参考方案2】:

如果我正确理解你的问题,你问的是粗体 () => function()。

我试图回答这个假设。

onTap, onPressed 以function 为参数。可能的值可以是

func callbackFunction() 
 // what ever we want to do onTap


1. onTap: callbackFunction

2. onTap: () => callbackFunction() // onTap: callbackFunction() it will invoke the method while building itself. 
                                   // So we are making it lazy by wrapping in another anonymous function. 

3. onTap: ()  callbackFunction(); 

4. onTap: () => print("tapped")   // anonymous one line function

5. onTap: ()  print("tapped"); 
               // what ever we want to do onTap
               print("tapped"); 
              // anonymous multiline function

【讨论】:

onTap: callbackFunction 和 onTap: () => callbackFunction() 有什么区别? 没有区别,使用这两种方式您将创建创建“callbackFunction”(参数类型函数)【参考方案3】:

它们不是一回事。 根据语言文档,粗箭头是返回语句的语法糖。

https://www.dartlang.org/guides/language/language-tour#functions

() => function()

与这条线相当

() return function(); 

不是这种说法

()  function();  //returns void

我猜你侥幸逃脱了,因为两个处理程序都有无效的倾向。

https://docs.flutter.io/flutter/dart-ui/VoidCallback.html

https://docs.flutter.io/flutter/gestures/GestureTapCallback.html

https://docs.flutter.io/flutter/material/ListTile/onTap.html

https://docs.flutter.io/flutter/material/IconButton/onPressed.html

void main() 
  num add(a,b) => a + b;
  num add_void(a,b)  a+b; 
  for (int i = 0; i < 5; i++) 
    print('hello $i + 1');
    print(add(i,i));
    print(add_void(i,i));
  

【讨论】:

【参考方案4】:

我学会了先将空括号视为构建,然后使用返回值执行此函数。

我在使用您发布的第二种方法时遇到了一个问题,其中颤振会崩溃并说明 “无法构建,因为框架已经在构建”,并在 *** 上找到了这篇文章,这可能会让您更好地了解这是什么意思。 Flutter - Cannot build because the frawework is already building

【讨论】:

【参考方案5】:

=>(粗箭头)语法对于包含单个语句的函数很方便。这种语法在将匿名函数作为参数传递时特别有用。

【讨论】:

以上是关于Dart 中 onPressed 属性后面的空括号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

用引号和大括号反应原生属性值

Dart 中的空安全是啥?

onPressed上的图标没有改变

Dart:这些方括号在构造函数中的作用是啥? [复制]

在 Dart 中打印不带括号的列表

用于空值的空检查运算符