簡體   English   中英

Flutter/Dart - () {} 和 () => {} 之間的區別

[英]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');
};

=> 簡寫表達式用於在函數中定義單個表達式。 足夠的定義和屬性。

  • 通過使用胖箭頭 => 需要刪除大括號。 否則,代碼編輯器會顯示錯誤。
  • 如果函數具有返回類型,則需要使用胖箭頭刪除 return 關鍵字。

下面兩者都是相同的函數,將返回相同的值。 只是語法不同

這是 => 類型

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM