繁体   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