Flutter / Dart-(){}和()=> {}之间的差异

时间:2018-08-16 01:18:36

标签: dart flutter

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

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

在其他地方看到的东西:

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

6 个答案:

答案 0 :(得分:10)

粗箭头语法只是返回表达式的简写方式,类似于(){ return expression; }
根据{{​​3}}。

  

注意:在箭头(=>)和分号(;)之间只能出现一个表达式,而不是一个语句。例如,您不能在其中放置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"; }的东西。

答案 1 :(得分:2)

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

() {}使您可以执行多个语句。

同时

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

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


创建非匿名函数的逻辑也相同。

单条语句功能 func() => y = x + x;

多条语句功能

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

答案 2 :(得分:1)

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

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

如果您习惯于使用其他语言,这些语言允许您在粗箭头后放置多个语句,则会发现您无法使用飞镖,如果尝试,则会出现以下错误:

这不起作用

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

答案 3 :(得分:0)

它们都用于表达匿名功能。粗箭头用于返回单行,大括号用于返回代码块。

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

答案 4 :(得分:0)

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

  • 使用粗箭头=>需要除去大括号。否则,代码编辑器将向您显示错误。
  • 如果函数具有返回类型,则需要使用胖箭头来删除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/

答案 5 :(得分:0)

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