[英]Flutter/Dart - Difference between () {} and () => {}
在 Flutter/Dart 中,示例有时显示粗箭头,有时不显示。 以下是示例:
RaisedButton(
onPressed: () {
setState(() {
_myTxt = "Text Changed";
});
},
在其他地方你会看到:
void main() => runApp(MyApp());
粗箭头语法只是返回表达式的简写,类似于(){ return expression; }
(){ return expression; }
。
根据文档。
注意:箭头 (=>) 和分号 (;) 之间只能出现表达式,而不是语句。 例如,您不能在其中放置 if 语句,但可以使用条件表达式
void main(){
final cls = TestClass();
cls.displayAnInt((){
//you can create statements here and then return a value
int num1 = 55;
int num2 = 1;
int sum = num1 + num2;
return sum;
});
cls.displayAnInt(() => 55 + 1); // simply return an int expression
}
class TestClass{
displayAnInt(makeIntFunc){
int intValue = makeIntFunc();
print('The int value is $intValue');
}
}
从上面的代码可以看出,当使用回调函数并返回一个值时,可以进行多行语句,而胖箭头只是一个没有返回关键字的表达式。
考虑到您关于胖箭头不支持 dart 中的多行语句的回答。 这是可以理解的,因为执行() => {somtheing}
意味着您正在返回一个地图,并且它会期望看到类似() => {'name':'John', 'age':25}
而不是() => { _myTxt = "Text Changed";_myTxt = "Never Mind"; }
() => { _myTxt = "Text Changed";_myTxt = "Never Mind"; }
。
我发现这意味着完全相同的事情。 唯一的区别是,如果只有一个语句,您可以使用(您不必)粗箭头。 以下是上面带有粗箭头的RaisedButton
声明。 请注意,我必须删除两个花括号和一个分号:
RaisedButton(
onPressed: () {
setState(() =>
_myTxt = "Text Changed"
);
},
如果你习惯了其他允许你在粗箭头后面放置多个语句的语言,你会发现你不能在 dart 中,如果你尝试你会得到一个错误,如下所示:
这行不通
RaisedButton(
onPressed: () {
setState(() => {
_myTxt = "Text Changed";
_myTxt = "Never Mind";
});
},
它们都用于表达匿名函数。 粗箭头用于返回单行,大括号用于返回代码块。
试图返回代码块的粗箭头将无法编译。
=>
用于返回匿名函数的值。
() {}
允许您执行多个语句。
尽管
() => {myVar}
或() => myVar;
允许一个单一的语句。
() => myVar;
返回一个语句时简短而简单。
同样的逻辑也适用于创建非匿名函数。
单语句 func func() => y = x + x;
多语句函数
func () {
x = x + x;
print(x + ' value of x');
};
=> 简写表达式用于在函数中定义单个表达式。 足够的定义和属性。
下面两者都是相同的函数,将返回相同的值。 只是语法不同
这是 => 类型
var size = (int s) => s*2;
这是return
类型
var size = (int s) {
return s*2;
}
用一个真实的代码示例来理解这个概念。 我们将考虑在 Dart 函数教程中完成的相同示例。 代码执行矩形的周长和面积。 这通常是在函数的帮助下完成的。
void main() {
findPerimeter(9, 6);
var rectArea = findArea(10, 6);
print('The area is $rectArea');
}
void findPerimeter(int length, int breadth) {
var perimeter = 2 * (length * breadth);
print('The perimeter is $perimeter');
}
int findArea(int length, int breadth) {
return length * breadth;
}
可以借助 Dart 中的粗箭头优化给定的函数。
void main() {
findPerimeter(9, 6);
var rectArea = findArea(10, 6);
print('The area is $rectArea');
}
void findPerimeter(int length, int breadth) =>
print('The perimeter is ${2 * (length * breadth)}');
int findArea(int length, int breadth) =>
length * breadth;
按下运行按钮后,我们仍然得到相同的结果。
The perimeter is 108
The area is 60
来自: https ://flutterrdart.com/dart-fat-arrow-or-short-hand-syntax-tutorial/
至少在 Dart 2.10 版的情况下似乎有一个区别:
如果要执行的表达式是Future,那么执行顺序就不一样了。
=>
new Future(() => print('future #1 of 2'))
.then((_) => new Future(() => print('future #1a (a new future)')))
.then((_) => print('future #1b'));
new Future(() => print('future #2 of 2'))
.then((_) => new Future(() => print('future #2a (aa new futue)' )))
.then((_) => print('future #2b'));
结果是:
future #1 of 2
future #2 of 2
future #1a (a new future)
future #1b
future #2a (aa new futue)
future #2b`
{}:
new Future(() => print('future #1 of 2'))
.then((_) => new Future(() => print('future #1a (a new future)')))
.then((_) => print('future #1b'));
new Future(() => print('future #2 of 2'))
.then((_) { new Future(() => print('future #2a (aa new futue)' )); })
.then((_) => print('future #2b'));
结果是
future #1 of 2
future #2 of 2
future #2b
future #1a (a new future)
future #1b
future #2a (a new futue)
Fat Aarrow => 单行代码 => 表达式形式,不使用return语句,表达式自动返回
void main() => runApp(MyApp()); // you cannot specify return here. This
is the turned value from the function. This is shorthand form
没有粗箭头,使用{},可以有多个语句,如果要返回值必须使用return语句,如果没有return可以跳过
setState(() {
_myTxt = "Text Changed";
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.