@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()),
),
],
],
);
});
}
所以,我要通过这个集团教程https://bloclibrary.dev/#/fluttertimertutorial。我还偶然发现了省略号的奇怪用法……的代码。这对我来说更奇怪,因为这里省略了if子句的花括号。
编辑:最初我删除了一些代码更清晰,但现在我意识到,我可能会遗漏一些上下文,所以我现在张贴这个小部件构建方法的完整代码。
这是扩展操作符(…)和空感知的扩展操作符(…?),在Dart 2.4中引入。这些操作符允许您在集合中插入多个值。
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);
在您的示例中,它允许您的if
中的列表插入到您的Row
的children
属性中。
也没有花括号,因为if
只包含一条语句。
如果你很好奇,你可以在这里了解更多关于展开运算符的信息:https://dart.dev/guides/language/language-tour
标记BLKKKBVSIK是公认的答案。我花了一段时间才得到它(主要是因为错误的分析器警告死代码)。忽略它,伙计们,这是一个bug),但是在dartPad中玩以下代码是有启发的:
void main() {
print([
if (true) ...[1],
if (false) ...[2, 3],
if (true) ...[4, 5],
]);
}