在颤动中,诸如Row/ ListView/之类的小部件Stack不能处理空子级。因此,如果我们要有条件地将小部件添加为子级,则通常需要执行以下操作:
Row(
children: <Widget>[
foo == 42 ? Text("foo") : Container(),
],
);
Run Code Online (Sandbox Code Playgroud)
但是,添加一个空容器感觉很奇怪。
另一个解决方案是where过滤器:
Row(
children: <Widget>[
foo == 42 ? Text("foo") : null,
].where((t) => t != null).toList(),
);
Run Code Online (Sandbox Code Playgroud)
这解决了空容器的问题,但是我们仍然有一个丑陋的三元组,编写起来很累。
有更好的解决方案吗?
Rém*_*let 10
编辑:
从Dart 2.2开始,新语法原生支持此功能:
Column(
children: [
if (foo != null) Text(foo),
Bar(),
],
);
Run Code Online (Sandbox Code Playgroud)
这个问题目前正在讨论在github 这里。
但是现在,您可以使用dart sync*函数:
Row(
children: toList(() sync* {
if (foo == 42) {
yield Text("foo");
}
}),
);
Run Code Online (Sandbox Code Playgroud)
在哪里toList:
typedef Iterable<T> IterableCallback<T>();
List<T> toList<T>(IterableCallback<T> cb) {
return List.unmodifiable(cb());
}
Run Code Online (Sandbox Code Playgroud)
它不仅解决了条件加法问题;多亏了,它还允许“传播算子” yield*。例:
List<Widget> foo;
Row(
children: toList(() sync* {
yield Text("Hello World");
yield* foo;
}),
);
Run Code Online (Sandbox Code Playgroud)
新的 Dart 语法允许在列表中使用“if”,这导致了这个简单的解决方案:
Row(
children: <Widget>[
if (foo == 42) Text("foo"),
],
);
Run Code Online (Sandbox Code Playgroud)
Row(
children: [
if (_id == 0) ...[
Container()
] else if(_id == 1)...[
Text("Hello")
] else ...[
SizedBox(width: 20)
],
],
),Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |