30.Flutter 零基础入门(三十):GridView 网格布局 —— 九宫格与商品列表必学

Flutter 零基础入门(三十):GridView 网格布局 ------ 九宫格与商品列表必学

如果说 ListView 是「信息流之王」,

那 GridView 就是:

电商 App、图片墙、九宫格页面的绝对核心

你在 App 中看到的这些页面:

  • 商品列表
  • 九宫格入口
  • 图片瀑布流
  • 功能面板

📌 本质上,全都是 GridView


一、什么是 GridView?

一句话理解:

GridView = 可以滚动的网格布局

对比一下:

组件 布局方式
ListView 一列
GridView 多列

二、最常见的使用场景

你以后几乎一定会用到 GridView 的地方:

  • 首页九宫格入口
  • 商品列表页
  • 图片展示页
  • 分类页面

三、GridView.count(最容易上手)

这是 新手最推荐的写法

1️⃣ 基本结构

dart 复制代码
GridView.count(
  crossAxisCount: 2,
  children: [],
)

📌 参数解释:

  • crossAxisCount:一行多少列

2️⃣ 一个最简单的示例

复制代码
GridView.count(
  crossAxisCount: 3,
  children: [
    Container(color: Colors.red),
    Container(color: Colors.blue),
    Container(color: Colors.green),
    Container(color: Colors.orange),
  ],
)

你会看到:

  • 一行 3 个
  • 自动换行
  • 可以滚动

四、GridView + List 数据渲染

和 ListView 一样,
GridView 也几乎一定是配合 List 使用的


1️⃣ 数据准备

复制代码
List<String> imageList = [
  '商品1',
  '商品2',
  '商品3',
  '商品4',
  '商品5',
];

2️⃣ 使用 map 生成网格

复制代码
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 的常用参数(非常重要)

1️⃣ 主轴 / 交叉轴间距

复制代码
GridView.count(
  crossAxisCount: 2,
  mainAxisSpacing: 10,
  crossAxisSpacing: 10,
)
  • mainAxisSpacing:纵向间距
  • crossAxisSpacing:横向间距

2️⃣ 子元素宽高比(关键)

复制代码
childAspectRatio: 0.7,

📌 含义:

宽 / 高

  • 1.0:正方形
  • < 1:偏高(商品卡片常用)
  • > 1:偏宽

六、封装商品卡片(真实项目写法)

1️⃣ 商品卡片 Widget

复制代码
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,
          ),
        ),
      ],
    ),
  );
}

2️⃣ GridView 使用卡片

复制代码
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


示例写法

复制代码
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 常见踩坑点

❌ GridView 放 Column 里不限制高度

❌ 忘记设置 childAspectRatio 导致变形

❌ GridView 嵌套 GridView

❌ 所有逻辑写在 build 里

❌ 不封装网格项


九、本篇你真正掌握了什么?

你已经学会:

  • GridView.count 的使用
  • GridView.builder 的标准写法
  • 网格间距 & 宽高比控制
  • 商品卡片封装
  • 九宫格 / 商品页结构

📌 到这里:

你已经可以独立完成电商类页面布局


十、一句话总结

GridView = 多列 ListView
真正的难点在"卡片设计"


🔜 下一篇预告

《Flutter 零基础入门(三十一):Stack 与 Positioned ------ 悬浮、角标与覆盖布局》

下一篇我们将学习:

  • Stack 的核心思想
  • Positioned 精准定位
  • 角标 / 悬浮按钮
  • 真实 App 的覆盖效果

🚀 UI 能力将再上一个台阶

相关推荐
你怎么知道我是队长1 小时前
前端学习---HTML---标签属性
前端·学习·html
yoyo君~1 小时前
从内存管理到并发架构:C++ 核心内功修炼指南
开发语言·c++·学习·无人机
fifiAmx2 小时前
Flutter 接入RevenueCat后台配置相关
flutter
汐瀼2 小时前
【AI个人学习】npm本地安装claude code白嫖minimax模型
前端·学习·npm
2501_941982052 小时前
告别手动,Java 自动化调用企微外部群的深度实践
开发语言·python
小岛前端2 小时前
从 Vite 到 Vize:Vue 开发体验的下一次飞跃
前端·vue.js
芝士雪豹只抽瑞克五2 小时前
Tomcat Web应用服务器笔记
前端·笔记·tomcat
不爱吃糖的程序媛2 小时前
Flutter Orientation 插件在鸿蒙平台的使用指南
flutter·华为·harmonyos
阿珊和她的猫2 小时前
实现网页锚点功能的技术指南
前端·javascript·vue.js·状态模式