颤动/飞镖 - (){}和()=> {}之间的差异

Hel*_*ate 6 dart flutter

在Flutter/Dart中,示例有时显示胖箭,有时不显示.以下是示例:

RaisedButton(
  onPressed: () {
    setState(() {
      _myTxt = "Text Changed";
    });
  },
Run Code Online (Sandbox Code Playgroud)

在其他地方你看到:

void main() => runApp(MyApp());
Run Code Online (Sandbox Code Playgroud)

non*_*hto 15

胖箭头语法只是返回表达式的简写,类似于(){ 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

从上面的代码中,您可以看到在使用回调函数时可以生成多行语句,然后返回一个值,而胖箭头只有一个没有返回关键字的表达式.

考虑你的答案关于胖箭不支持dart中的多行语句.这是可以理解的,因为这样做() => {somtheing}意味着你要返回一张地图,它会期望看到类似的东西,() => {'name':'John', 'age':25}而不是() => { _myTxt = "Text Changed";_myTxt = "Never Mind"; }.


alf*_*edo 9

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

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

尽管

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

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


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

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

多语句函数

func () {
   x = x + x; 
   print(x + ' value of x');
};
Run Code Online (Sandbox Code Playgroud)


Hel*_*ate 6

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

RaisedButton(
  onPressed: () {
    setState(() =>
      _myTxt = "Text Changed"
    );
  },
Run Code Online (Sandbox Code Playgroud)

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

这行不通

RaisedButton(
  onPressed: () {
    setState(() => {
      _myTxt = "Text Changed";
      _myTxt = "Never Mind";
    });
  },
Run Code Online (Sandbox Code Playgroud)


Kri*_*ews 5

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

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