else 之后的 Dart Elipsis

Dart Elipsis after else

@override
Widget build(BuildContext context) {
  return BlocBuilder < TimerBloc, TimerState > (
    buildWhen: (prev, state) => prev.runtimeType != runtimeType,
    builder: (context, state) {
      return Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
//for example here: if (state is TimerInitial)...[
              FloatingActionButton(
                child: Icon(Icons.play_arrow),
                onPressed: () => context
                .read < TimerBloc > ()
                .add(TimerStarted(duration: state.duration)),
              ),
            ],
            if (state is TimerRunInProgress)...[
                FloatingActionButton(
                  child: Icon(Icons.pause),
                  onPressed: () => context.read < TimerBloc > ().add(TimerPaused()),
                ),
                FloatingActionButton(
                  child: Icon(Icons.replay),
                  onPressed: () => context.read < TimerBloc > ().add(TimerReset()),
                )
              ],
              if (state is TimerRunPause)...[
                FloatingActionButton(
                  child: Icon(Icons.play_arrow),
                  onPressed: () =>
                  context.read < TimerBloc > ().add(TimerResumed()),
                ),
                FloatingActionButton(
                  child: Icon(Icons.replay),
                  onPressed: () => context.read < TimerBloc > ().add(TimerReset()),
                ),
              ],
        ],
      );
    });
}

所以,我正在学习这个 bloc 教程 https://bloclibrary.dev/#/fluttertimertutorial。而且我偶然发现代码中省略号“...”的奇怪用法。对我来说比较陌生,因为这里省略了if子句的花括号?

编辑:最初我为了更清楚地删除了一些代码,但现在我意识到我可能省略了一些上下文,所以我现在发布这个小部件构建方法的完整代码。

这是 Dart 2.4 中引入的展开运算符 (...) 和空值感知展开运算符 (...?)。这些运算符允许您将多个值插入到集合中。

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

在您的示例中,它允许将 if 中的列表插入到 Rowchildren 属性 中。

此外,没有大括号,因为 if 只包含 1 个语句。

如果你好奇,可以在这里了解更多关于传播运算符的信息:https://dart.dev/guides/language/language-tour

标记 BLKKKBVSIK 作为公认的答案。我花了一段时间才得到它(主要是因为错误的分析器警告死代码。忽略它伙计们,这是一个错误。)但是在 dartPad 中玩下面的代码很有启发性:

void main() {
  print([
    if (true) ...[1],
    if (false) ...[2, 3],
    if (true) ...[4, 5],
  ]); 
}