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

如何使用ListView.Builder或ListView.Separated实现Flutter水平滚动列表?

实现水平滚动食品列表的修正方案

你的代码存在几个关键问题导致水平滚动未生效,以下是具体修正步骤和完整代码:

核心问题修正点

  • 启用水平滚动:取消scrollDirection: Axis.horizontal的注释,这是开启水平滚动的关键配置
  • 替换布局组件:ListTile是垂直方向的布局组件,不适合水平列表子项,改用自定义卡片布局展示图片、名称和时间
  • 调整分隔符:Divider是垂直方向的分隔线,水平列表需用SizedBox(width: 16)作为水平间隔
  • 移除固定宽度限制:Container的width:500.0会限制滚动区域,删除该配置让ListView自适应父容器宽度

完整修正代码

import 'package:foodrecipe/components/foodColor.dart';
import 'package:flutter/material.dart';

class FoodItems extends StatelessWidget {
  FoodItems({super.key});

  final List<Map> arrFoodItems = [
    {
      "name": "Classic Green Salad 1",
      "Time": "16",
      "imageUrl": "assets/greenSalad.png"
    },
    {
      "name": "Classic Green Salad 2",
      "Time": "17",
      "imageUrl": "assets/greenSalad.png"
    },
    {
      "name": "Classic Green Salad 3",
      "Time": "18",
      "imageUrl": "assets/greenSalad.png"
    },
    {
      "name": "Classic Green Salad 4",
      "Time": "19",
      "imageUrl": "assets/greenSalad.png"
    },
    {
      "name": "Classic Green Salad 5",
      "Time": "20",
      "imageUrl": "assets/greenSalad.png"
    },
  ];

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 250.0,
      child: Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10.0),
          color: FoodColor.colourStylesNeutralColourGray4,
        ),
        padding: const EdgeInsets.symmetric(vertical: 16),
        child: ListView.separated(
          scrollDirection: Axis.horizontal, // 开启水平滚动
          padding: const EdgeInsets.symmetric(horizontal: 16),
          itemBuilder: ((context, index) {
            final item = arrFoodItems[index];
            // 自定义水平卡片布局
            return SizedBox(
              width: 180, // 固定子项宽度,保证布局一致性
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  // 展示食品图片
                  ClipRRect(
                    borderRadius: BorderRadius.circular(8),
                    child: Image.asset(
                      item["imageUrl"],
                      height: 120,
                      width: double.infinity,
                      fit: BoxFit.cover,
                    ),
                  ),
                  const SizedBox(height: 8),
                  // 食品名称
                  Text(
                    item["name"],
                    style: const TextStyle(
                      fontSize: 16,
                      fontWeight: FontWeight.w500,
                    ),
                    maxLines: 1,
                    overflow: TextOverflow.ellipsis,
                  ),
                  const SizedBox(height: 4),
                  // 耗时信息
                  Text(
                    "${item['Time']} mins",
                    style: TextStyle(
                      fontSize: 14,
                      color: Colors.grey[600],
                    ),
                  ),
                ],
              ),
            );
          }),
          // 水平方向的子项间隔
          separatorBuilder: (context, index) => const SizedBox(width: 16),
          itemCount: arrFoodItems.length,
        ),
      ),
    );
  }
}

额外优化说明

  • 给子项设置固定宽度,确保每个卡片布局统一
  • 用Image.asset加载本地图片,配合ClipRRect实现圆角效果
  • 添加内外边距,让内容和容器边缘保留合理间距,提升视觉体验
  • 对文本设置行数限制和溢出处理,避免长文本破坏布局

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:22:24