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

Flutter如何实现双行横向可滚动的分类列表(ListView/GridView改造)

改造实现方案

你只需要把原代码中的ListView.builder替换为GridView.builder,配置网格参数即可实现双行横向滚动效果,核心改动如下:

  • 滚动方向保持Axis.horizontal不变
  • 配置SliverGridDelegateWithFixedCrossAxisCount,设置crossAxisCount: 2指定双行布局
  • 调整外层Container高度适配双行item的总高度
  • 原有item的布局、点击逻辑完全不用修改

改造后完整代码

_catList() {
return Container(
  // 调整高度适配双行布局,可根据实际效果微调
  height: 270,
  child: GridView.builder(
    itemCount: catList.length < 10 ? catList.length : 10,
    scrollDirection: Axis.horizontal,
    shrinkWrap: true,
    physics: const AlwaysScrollableScrollPhysics(),
    // 网格布局配置
    gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 2, // 纵轴展示2行,实现双行效果
      crossAxisSpacing: 8, // 两行之间的垂直间距
      mainAxisSpacing: 10, // 同一行相邻item的水平间距
      childAspectRatio: 1.1, // 单个item的宽高比,可根据你的设计调整
    ),
    itemBuilder: (context, index) {
      return GestureDetector(
          onTap: () async {
            if (catList[index].subList == null ||
                catList[index].subList.length == 0) {
              await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => ProductList(
                        name: catList[index].name,
                        id: catList[index].id,
                        tag: false,
                        updateHome: widget.updateHome),
                  ));
              if (mounted) setState(() {});
            } else {
              await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => SubCat(
                        title: catList[index].name,
                        subList: catList[index].subList,
                        updateHome: widget.updateHome),
                  ));
              if (mounted) setState(() {});
            }
          },
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Padding(
                padding: const EdgeInsetsDirectional.only(bottom: 5.0),
                child: ClipRRect(
                  borderRadius: BorderRadius.circular(25.0),
                  child: FadeInImage(
                    fadeInDuration: const Duration(milliseconds: 50),
                    image: NetworkImage(
                      catList[index].image,
                    ),
                    height: 100.0,
                    width: 100.0,
                    fit: BoxFit.cover,
                    imageErrorBuilder: (context, error, stackTrace) =>
                        erroWidget(100),
                    placeholder: placeHolder(100),
                  ),
                ),
              ),
              Container(
                child: Text(
                  catList[index].name,
                  style: Theme.of(context).textTheme.caption?.copyWith(
                      color: colors.fontColor,
                      fontWeight: FontWeight.w600,
                      fontSize: 15),
                  overflow: TextOverflow.ellipsis,
                  textAlign: TextAlign.center,
                ),
                width: 100,
              ),
            ],
          ),
        );
    },
  ),
);
}

如果出现item显示挤压的情况,微调childAspectRatio和外层Container的高度即可适配你的设计效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:27:03