You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter Grid Builder中每10个网格后添加全宽黄色容器

解决Flutter GridView每10个网格后插入横向分隔容器的问题

你的代码存在三个核心问题:itemCount未考虑分隔符数量、网格序号计算错误、分隔符无法占满整行。以下提供两种解决方案:

方案一:使用第三方包(推荐,更简洁)

借助flutter_staggered_grid_view实现可变跨列的网格布局,让分隔符占据整行:

  1. 添加依赖到pubspec.yaml:
dependencies:
  flutter_staggered_grid_view: ^0.7.0
  1. 实现代码:
StaggeredGridView.builder(
  itemCount: 109, // 100个网格 + 9个分隔符(每10个网格后插入1个,共9个)
  gridDelegate: SliverStaggeredGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 5,
    staggeredTileBuilder: (int index) {
      // 分隔符位置跨5列,普通网格占1列
      return (index + 1) % 11 == 0 
          ? const StaggeredTile.fit(5) 
          : const StaggeredTile.fit(1);
    },
  ),
  itemBuilder: (BuildContext context, int index) {
    if ((index + 1) % 11 == 0) {
      // 黄色区域分隔容器
      return Container(
        color: Colors.yellow,
        height: 50,
        alignment: Alignment.center,
        child: const Text('区域分隔'),
      );
    } else {
      // 计算实际网格序号:减去前面已插入的分隔符数量
      final int gridNumber = index - (index ~/ 11) + 1;
      return Container(
        margin: const EdgeInsets.all(8),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),
          color: Colors.white,
        ),
        child: Center(
          child: Text('$gridNumber'),
        ),
      );
    }
  },
)

方案二:不使用第三方包(原生组件实现)

用ListView包裹每组网格和分隔符,每组展示10个网格:

ListView.builder(
  itemCount: 10, // 共10组,每组10个网格
  itemBuilder: (context, groupIndex) {
    return Column(
      children: [
        // 当前组的10个网格
        GridView.builder(
          shrinkWrap: true,
          physics: const NeverScrollableScrollPhysics(),
          itemCount: 10,
          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 5,
          ),
          itemBuilder: (context, index) {
            final int gridNumber = groupIndex * 10 + index + 1;
            return Container(
              margin: const EdgeInsets.all(8),
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(10),
                color: Colors.white,
              ),
              child: Center(
                child: Text('$gridNumber'),
              ),
            );
          },
        ),
        // 最后一组不显示分隔符
        if (groupIndex != 9)
          Container(
            color: Colors.yellow,
            height: 50,
            alignment: Alignment.center,
            child: const Text('区域分隔'),
          ),
      ],
    );
  },
)

原代码问题说明

  1. itemCount错误:原代码设置为100,但插入9个分隔符后需要109个item位置,导致分隔符无法正确插入。
  2. 网格序号计算错误:分隔符占用了index位置,后续网格的序号需要减去已插入的分隔符数量,否则会出现序号跳变。
  3. 分隔符宽度无效:double.infinity在GridView中不生效,因为item宽度由crossAxisCount控制,必须让分隔符跨所有列才能占满整行。

内容的提问来源于stack exchange,提问作者Raj A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:22:05