【发布时间】:2019-01-22 21:40:22
【问题描述】:
在 Flutter/Dart 中,示例有时显示粗箭头,有时不显示。以下是示例:
RaisedButton(
onPressed: () {
setState(() {
_myTxt = "Text Changed";
});
},
你看到的其他地方:
void main() => runApp(MyApp());
【问题讨论】:
在 Flutter/Dart 中,示例有时显示粗箭头,有时不显示。以下是示例:
RaisedButton(
onPressed: () {
setState(() {
_myTxt = "Text Changed";
});
},
你看到的其他地方:
void main() => runApp(MyApp());
【问题讨论】:
粗箭头语法只是返回表达式的简写,类似于(){ return expression; }。
根据docs.
注意:在箭头 (=>) 和分号 (;) 之间只能出现表达式,而不是语句。例如,您不能在其中放置 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');
}
}
从上面的代码可以看出,当使用回调函数并返回一个值时,可以进行多行语句,而粗箭头只是一个没有return关键字的表达式。
考虑到您关于胖箭头不支持 dart 中的多行语句的回答。这是可以理解的,因为执行 () => {somtheing} 意味着您正在返回一张地图,并且它会期望看到类似 () => {'name':'John', 'age':25} 而不是 () => { _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() => y = x + x;
多语句函数
func () {
x = x + x;
print(x + ' value of x');
};
【讨论】:
=> 简写表达式用于在函数中定义单个表达式。定义和属性就够了。
Below 两者是相同的函数,将返回相同的值。只是语法不同
这是带有 => 类型的
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)
【讨论】:
胖箭头 => 单行代码 => 表达式形式,不使用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";
});
【讨论】: