dart - setState 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'); 之类的表达式完成的。

最佳答案

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

正如官方文档所说的 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 作为结果返回,否则请不要使用它


回复编辑:

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

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

这里 => 返回一个带有 setState 结果的 Set,即它会返回 { (setState 的结果call) } 这可能是 { null }

当您调用 setState 时,将执行以下代码,该代码再次返回带有 { 的 Set (打印结果),(_product.add 的结果), }

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

状态会随着您执行 _products.add('More stuff') 而更新,其中 'More stuff' 将被添加到 _products 无论你在哪里调用它。当调用 setState 时,将使用 _products 重新构建小部件并添加新数据。

希望这有帮助!

https://stackoverflow.com/questions/55350820/

相关文章:

android-studio - flutter :发布失败

dart - Flutter:从 Activity 上下文外部调用 startActivity()

flutter - 找不到名为 "split-per-abi"的选项

android - 在模拟器相机应用程序中看不到虚拟场景图像

dart - Flutter.io (dart) - 如何创建左填充覆盖?

flutter - 根据另一个小部件的位置/大小定位/调整小部件的大小

dart - Flutter - 动态构建小部件

dart - 如何在 flutter 搜索页面小部件中消除搜索建议?

dart - Flutter - 在底部绘制一个矩形

dart - 为什么 cupertino_icons 中的图标很少?