在 Dart 里面,方括号 [ ... ] 就是字面量语法(literal syntax)来创建一个 List。
列表字面量
[1, 2, 3] // 创建 List<int> ['a', 'b'] // 创建 List<String> [Text("Hi"), Icon(Icons.add)] // 创建 List<Widget>列表里可以直接放对象
就像你写的TextWidget.h1(...)、ImageWidget.img(...),它们都是Widget对象,放到列表里没有问题。可以写表达式 / 代码
Dart 允许在列表字面量里写表达式,比如:[DateTime.now(), 1 + 2, "Hello".toUpperCase()]这些都会在运行时被计算成一个对象,然后放进 List 里。
支持条件和循环 (collection if / for)
这是 Dart 列表的一个特色语法:条件
if[ Text("标题"), if (showIcon) Icon(Icons.star), ]如果
showIcon == false,那个Icon就不会被加进去。循环
for[ for (var i in items) Text(i), ]等价于:
items.map((i) => Text(i)).toList()
实际案例:
Widget sliderItem(WelcomeModel item) {
return Builder(
builder: (BuildContext context) {
return <Widget>[
// 图
if (item.image != null)
ImageWidget.img(
item.image!,
fit: BoxFit.cover,
),
// 标题
if (item.title != null)
TextWidget.h1(
item.title ?? "",
maxLines: 2,
softWrap: true,
textAlign: TextAlign.center,
),
// 描述
if (item.desc != null)
TextWidget.label(
item.desc ?? "",
maxLines: 3,
softWrap: true,
textAlign: TextAlign.center,
)
]
.toColumn(mainAxisAlignment: MainAxisAlignment.spaceAround)
.width(MediaQuery.of(context).size.width);
},
);
}
如果 3 个条件都为 false,那么 if (...) 里面的内容都不会被插入,最终就会得到一个 空的 List<Widget>。
// 相当于 <Widget>[]; 是一个普通的空列表
var widgets = <Widget>[
if (false) Text("标题"),
if (false) Icon(Icons.star),
if (false) Text("描述"),
];
print(widgets); // []