
如果说 ListView 是「信息流之王」, 那 GridView 就是:
电商 App、图片墙、九宫格页面的绝对核心
你在 App 中看到的这些页面:
📌 本质上,全都是 GridView。
一句话理解:
GridView = 可以滚动的网格布局
对比一下:
组件 | 布局方式 |
|---|---|
ListView | 一列 |
GridView | 多列 |
你以后几乎一定会用到 GridView 的地方:
这是 新手最推荐的写法。
GridView.count(
crossAxisCount: 2,
children: [],
)
📌 参数解释:
crossAxisCount:一行多少列GridView.count(
crossAxisCount: 3,
children: [
Container(color: Colors.red),
Container(color: Colors.blue),
Container(color: Colors.green),
Container(color: Colors.orange),
],
)
你会看到:
和 ListView 一样,GridView 也几乎一定是配合 List 使用的。
List<String> imageList = [
'商品1',
'商品2',
'商品3',
'商品4',
'商品5',
];
GridView.count(
crossAxisCount: 2,
children: imageList.map((item) {
return Container(
margin: EdgeInsets.all(8),
color: Colors.grey[300],
child: Center(
child: Text(item),
),
);
}).toList(),
)
📌 你会发现:
GridView 和 ListView 的使用方式几乎一模一样
GridView.count(
crossAxisCount: 2,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
)
mainAxisSpacing:纵向间距crossAxisSpacing:横向间距childAspectRatio: 0.7,
📌 含义:
宽 / 高
1.0:正方形< 1:偏高(商品卡片常用)> 1:偏宽Widget buildGridItem(String title) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 4,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 图片区域
Expanded(
child: Container(
color: Colors.grey[300],
child: Center(child: Text('图片')),
),
),
Padding(
padding: EdgeInsets.all(8),
child: Text(
title,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
],
),
);
}
GridView.count(
crossAxisCount: 2,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
childAspectRatio: 0.7,
padding: EdgeInsets.all(10),
children: imageList.map((item) {
return buildGridItem(item);
}).toList(),
)
📌 到这里,你已经写出了一个标准商品列表页。
当数据很多时:
👉 必须使用 GridView.builder
GridView.builder(
itemCount: imageList.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
childAspectRatio: 0.7,
),
itemBuilder: (context, index) {
return buildGridItem(imageList[index]);
},
);
📌 记住一句话:
builder = 性能更好 + 真正项目写法
❌ GridView 放 Column 里不限制高度 ❌ 忘记设置 childAspectRatio 导致变形 ❌ GridView 嵌套 GridView ❌ 所有逻辑写在 build 里 ❌ 不封装网格项
你已经学会:
📌 到这里:
你已经可以独立完成电商类页面布局
GridView = 多列 ListView 真正的难点在“卡片设计”
《Flutter 零基础入门(三十一):Stack 与 Positioned —— 悬浮、角标与覆盖布局》
下一篇我们将学习:
🚀 UI 能力将再上一个台阶