【发布时间】:2019-02-23 12:44:18
【问题描述】:
我知道在onPressed 和onTap 之后为小部件调用函数的语法。有两个选项我们可以使用() => function() 或() { function(); } 语法。空括号是什么意思?
【问题讨论】:
-
你也可以使用
onTap: function
我知道在onPressed 和onTap 之后为小部件调用函数的语法。有两个选项我们可以使用() => function() 或() { function(); } 语法。空括号是什么意思?
【问题讨论】:
onTap: function
() => expression 或 () { statements } 创建闭包或内联函数。
通过这种方式,您可以创建内联函数,该函数作为参数传递,以便在您传递给它的小部件发生onPressed 事件时调用。
expression 或 statements 具有可用的创建它们的上下文,并且可以访问和使用该上下文中可用的所有成员和标识符(变量、方法、函数、typedef...)。
如果你使用
onPressed: myFunction 传递了对现有函数的引用。onPressed 和myFunction 预期的回调参数兼容时才有效。onPressed: myFunction() myFunction() 被执行并将返回的结果传递给onPressed。这是一个常见的错误,当实际上是为了传递对myFunction 的引用而不是调用它时,无意中犯了这个错误。【讨论】:
onPressed: myFunction 将函数myFunction 的引用(指针)传递给onPressed 参数。额外的() 导致myFunction 被执行,myFunction() 的返回值 被传递给onPressed,这通常不是你想要的。
如果我正确理解你的问题,你问的是粗体 () => 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
【讨论】:
它们不是一回事。 根据语言文档,粗箭头是返回语句的语法糖。
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));
}
}
【讨论】:
我学会了先将空括号视为构建,然后使用返回值执行此函数。
我在使用您发布的第二种方法时遇到了一个问题,其中颤振会崩溃并说明 “无法构建,因为框架已经在构建”,并在 StackOverflow 上找到了这篇文章,这可能会让您更好地了解这是什么意思。 Flutter - Cannot build because the frawework is already building
【讨论】:
=>(粗箭头)语法对于包含单个语句的函数很方便。这种语法在将匿名函数作为参数传递时特别有用。
【讨论】: