【问题标题】:Flutter/Dart - Difference between () {} and () => {}Flutter/Dart - () {} 和 () => {} 之间的区别
【发布时间】:2019-01-22 21:40:22
【问题描述】:

在 Flutter/Dart 中,示例有时显示粗箭头,有时不显示。以下是示例:

RaisedButton(
  onPressed: () {
    setState(() {
      _myTxt = "Text Changed";
    });
  },

你看到的其他地方:

void main() => runApp(MyApp());

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    粗箭头语法只是返回表达式的简写,类似于(){ 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"; } 的内容。

    【讨论】:

      【解决方案2】:

      我发现这意味着完全相同的事情。唯一的区别是,如果只有一个语句,您可以使用(您不必)粗箭头。以下是上面带有粗箭头的RaisedButton 声明。请注意,我必须删除两个花括号和一个分号:

      RaisedButton(
        onPressed: () {
          setState(() =>
            _myTxt = "Text Changed"
          );
        },
      

      如果你习惯了其他允许你在粗箭头后面放置多个语句的语言,你会发现你不能在 dart 中,如果你尝试你会得到一个错误,如下所示:

      这行不通

      RaisedButton(
        onPressed: () {
          setState(() => {
            _myTxt = "Text Changed";
            _myTxt = "Never Mind";
          });
        },
      

      【讨论】:

      • 我发现不使用粗箭头更方便,所以你可以有多个语句。
      【解决方案3】:

      它们都是用来表达匿名函数的。粗箭头用于返回单行,大括号用于返回代码块。

      试图返回代码块的粗箭头将无法编译。

      【讨论】:

        【解决方案4】:

        => 用于返回匿名函数的值。

        () {} 允许您执行多个语句。

        同时

        () => {myVar}() => myVar; 允许一个单个语句。

        () => myVar; 在返回一个语句时简短而简单。


        同样的逻辑也适用于创建非匿名函数。

        单语句函数 func() => y = x + x;

        多语句函数

        func () {
           x = x + x; 
           print(x + ' value of x');
        };
        

        【讨论】:

          【解决方案5】:

          => 简写表达式用于在函数中定义单个表达式。定义和属性就够了。

          • 使用粗箭头 => 需要删除大括号。否则,代码编辑器会显示错误。
          • 如果函数具有返回类型,则需要使用胖箭头删除 return 关键字。

          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/

          【讨论】:

            【解决方案6】:

            至少在 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)
            

            【讨论】:

              【解决方案7】:

              胖箭头 => 单行代码 => 表达式形式,不使用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";
                  });
              

              【讨论】:

                猜你喜欢
                • 2014-08-28
                • 1970-01-01
                • 2023-01-18
                • 2023-02-11
                • 1970-01-01
                • 2021-10-11
                • 2020-08-14
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多