[英]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.