代码之家  ›  专栏  ›  技术社区  ›  Muljayan

带大括号的胖箭头表示法

  •  1
  • Muljayan  · 技术社区  · 7 年前

    我对飞镖/颤振很陌生,我对=>符号有点困惑。文档中说,=>符号用作返回单个表达式的简写。

    当我试图在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 包含打印功能和产品。添加实际更新状态。它不应该抛出某种错误吗,因为通常setState是由如下表达式完成的 _products.add('More stuff'); .

    0 回复  |  直到 7 年前
        1
  •  4
  •   Ashish Modi    6 年前

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

    正如官方文件所说 here ,是的 => 用作 { return ... } => 只会把右边生产的东西退回去。

    也来自 Dart 2.2 Set 可以用逗号分隔的值定义 {} 如文件所述 here .

    {} 如果语句用逗号分隔,则将其视为 功能。每个元素都是一个函数调用, () => { f(a) , f(b), g(a),} 会返回一个 以及每个函数调用返回的元素。

    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的方法,除非您希望 作为结果返回


    回复编辑:

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

    这里是 => 结果是 setState { (result of setState call) } 可能是 { null }

    正如你所说 执行下面的代码,它再次返回 具有 { (result of print), (result of _product.add), }

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

    状态将更新,因为您正在执行 _products.add('More stuff') ,其中 'More stuff' 将添加到 _products 不管你怎么称呼它。什么时候? 设置状态 _产品 添加了新数据。

        2
  •  4
  •   lrn    6 年前

    对于记录,建议您使用的语法是:

    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 )把它还给我。

    更糟糕的是,代码 作品 . 集合文字将按顺序计算其表达式,但没有人看到创建的集合。语法并没有泛化——你不能把任何表达式改成for循环(但是,你可以在下一个版本的Dart中)。

    所以,在飞镖中,永远不要使用 => { 希望 返回集合或地图。