I am very new to Dart/Flutter and I have a confusion regarding the => notation. The documentation says that the => notation is used as a shorthand to return a single expression.

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

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

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

Now when i change the setState method with => notation

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

上面提到的两种方法都有效,即它们按预期设置状态.我所要做的就是在使用胖箭头符号时将分号改为逗号.

这背后的逻辑是什么?胖箭头符号如何处理包含多个表达式的花括号.

Edit

As mentioned by Hemanth Raj the => returns a set and the code segment containing the => notation can be written as follows.

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

包含打印函数和_products t.add的返回set实际上是如何更新状态的.它不应该抛出某种错误吗?因为setState通常是由_products.add('More stuff');这样的表达式完成的.

推荐答案

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

正如官方文档所说的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

Note: This method of returning set with comma separated function calls is not recommended, would request you also not to use it unless you wanted a 100 to be returned as result


Reply to the Edit :

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

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

在这里,=>返回结果为setStateSet,也就是说,它将返回{ (result of setState call) },可能是{ null }

当您调用setState时,将执行下面的代码,它再次返回带有{ (result of print), (result of _product.add), }Set

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

状态将随着您执行_products.add('More stuff')而更新,其中'More stuff'将被添加到_products,而不管您在哪里调用它.当调用setState时,将使用添加了新数据的_products来重建微件.

希望这能帮上忙!

Flutter相关问答推荐

Flutter:如何在Android上的其他应用程序中恢复音频播放

Flutter:带有表单的SpeechToTextprovider

如何在SingleChildScrollView中使用GridView

DART 3.3:为什么扩展类型不起作用?

Flutter 中的多页表现

如何将Xpriter代码页更改为代码页27?

如何将Will POP示波器转换为POP数据抖动的POP示波器

我不能在Fighting中裁剪图片输入错误,否则应用程序会崩溃

任务';:app:check DebugDuplicateClasss';的Ffltter Share_plus抛出执行失败

如何翻转这种剪刀设计

在Dart中使用Riverpod代码生成时出现问题(addListener)

如何在巡逻测试期间重新启动dart 侧应用程序状态?

如何将小部件代码移动到另一个文件以获得更好的可读性

尽管 onCollision 处理了我的角色还是从平台上掉了下来

即使小部件比Flutter 中的屏幕更宽,也始终显示滚动条

Flutter列顶部和底部出现不必要的边距问题

面对Flutter 中的行和列问题

将 String 与 List 元素进行比较时出现问题

如何建立最近的文件列表?

更新未知文档 ID firebase\flutter 中的字段