setState Dart / Flutter中带有花括号的粗箭头符号

时间:2019-03-26 06:11:19

标签: dart flutter

我对Dart / Flutter非常陌生,对=>表示法感到困惑。该文档说==表示法是返回单个表达式的简写。

  

bool isNoble(int atomicNumber)=> _nobleGases [atomicNumber]!= null;

当我试图在Flutter应用程序中设置状态时,我会怀疑。

RaisedButton(
  onPressed: () => {
    setState(() {
      print('hello');
      _products.add('More stuff');
    })
  },
  child: Text('Add Product'),
),

现在,当我用=>表示法更改setState方法时

RaisedButton(
  onPressed: () => {
    setState(() => {
      print('hello'),
      _products.add('More stuff'),
    })
  },
  child: Text('Add Product'),
),

上述两种方法均有效,即它们按预期设置状态。我要做的就是使用粗箭头符号将分号更改为逗号。

这背后的逻辑是什么?粗箭头符号如何与其中包含多个表达式的花括号一起使用。

修改

正如Hemanth Raj所提到的,=>返回一个集合,并且包含=>表示法的代码段可以编写如下。

RaisedButton(
  onPressed: () => {
    setState(() {
     return {
       print('hello'),
       _products.add('More stuff'),
     };
    })
  },
  child: Text('Add Product'),
),

返回的set包含打印功能和_products.add如何实际更新状态。它不应该引发某种错误,因为通常setState是由诸如_products.add('More stuff');之类的表达式完成的。

2 个答案:

答案 0 :(得分:3)

为记录起见,推荐的语法是:

RaisedButton(
    onPressed: () {
      setState(() {
        print('hello');
        _products.add('More stuff');
      });
    },
    child: Text('Add Product'),
),

语法(args) => { statements }不是 Dart编写函数体的方式,您可以执行(args) { statements }(args) => singleExpression

此外,您需要使用分号;而不是逗号来终止语句。

正如其他人指出的那样,您使用的(args) => { print("something"), somethingElse }语法实际上是在创建一个集合(Set<void>是因为print的返回类型是void)并返回

这是一个小的语法错误的完美风暴,对于JavaScript程序员来说,这似乎是合理的,而这实际上意味着Dart中完全不同的东西。 而且,为了使情况变得更糟,代码起作用。 set文字将按顺序评估其表达式,无论如何都不会看到创建的set。语法只是不通用-您不能将任何表达式更改为for循环(不过,您将在下一版的Dart中使用)。

因此,在Dart中,除非您想要返回集合或地图,否则永远不要使用=> {

答案 1 :(得分:2)

这是我想回答的有趣问题之一。

正如官方文档所说的here,是的,=>{ return ... }的简写语法,这意味着=>只会返回右侧产生的任何内容。

Dart 2.2及更高版本开始,Set可以用文档here中提到的用{}括起来的逗号分隔值来定义。

因此,您正在使用的语法,即{},且语句之间用逗号分隔,Set函数将其视为=>。每个元素都是函数调用,() => { f(a) , f(b), g(a),}将返回一个Set以及每个函数调用返回的元素。

此示例可以帮助您了解实际情况:

dynamic reflect(dynamic a){
  return a;
}

void main() {  
    Function shortHand = () => {reflect(1),reflect('a'),reflect({}),reflect([]),}; // this function when called will return a Set<dynamic>
    print(shortHand().runtimeType); // will print `_LinkedHashSet<dynamic>`
}

所以语法

() => '...'返回String

() => [ ... , ..., ...]返回List

和类似的() => { ... , ... , ... }实际上返回一个Set

注意:不建议使用这种用逗号分隔的函数调用返回set的方法,除非您希望将Set作为结果返回,否则将要求您也不要使用它。


回复“编辑”:

让我为您分解函数调用和结果。所以你的代码是这样的,

() => {
    setState(() {
     return {
       print('hello'),
       _products.add('More stuff'),
     };
    })
  }

这里=>返回一个Set,结果为setState,即返回{ (result of setState call) },可能是{ null }

调用setState后,以下代码将执行,该代码再次返回Set{ (result of print), (result of _product.add), }

() {
      return {
        print('hello'),
        _products.add('More stuff'),
      };
    }

在执行_products.add('More stuff')时,状态会更新,无论您在何处调用,'More stuff'都会添加到_products中。调用setState时,将使用_products重建小部件并添加新数据。

希望这对您有帮助!