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

SingleChildScrollView嵌套ListView报错RenderBox was not laid out求助

解决方案

问题出在横向滚动的SingleChildScrollView没有为内部的ListView提供明确的宽度约束——横向滚动容器的子级可以无限延伸,而纵向滚动的ListView必须知道自身的宽度才能完成布局,这就导致了RenderBox was not laid out错误。

你不需要用Expanded(它只在Row/Column/Flex这类组件中生效),只需要给ListView添加明确的宽度约束即可,以下是两种可行方案:

方案1:用SizedBox指定固定宽度

直接给ListView包裹一个SizedBox,设置明确的宽度值:

return SingleChildScrollView(
  scrollDirection: Axis.horizontal,
  child: SizedBox(
    width: 300, // 根据需求调整宽度
    child: ListView.builder(
      shrinkWrap: true,
      primary: false,
      itemCount: 5,
      itemBuilder: (context, index) {
        return const SizedBox(
          height: 120, // 增大高度以便观察纵向滚动效果
          width: double.infinity,
          child: Card(
            margin: EdgeInsets.all(8),
            child: Center(child: Text('列表项 $index')),
          ),
        );
      },
    ),
  ),
);

方案2:用ConstrainedBox设置最小宽度

如果需要宽度自适应但又要保证最小尺寸,可以用ConstrainedBox:

return SingleChildScrollView(
  scrollDirection: Axis.horizontal,
  child: ConstrainedBox(
    constraints: const BoxConstraints(minWidth: 250), // 最小宽度约束
    child: ListView.builder(
      shrinkWrap: true,
      primary: false,
      itemCount: 5,
      itemBuilder: (context, index) {
        return const SizedBox(
          height: 120,
          width: double.infinity,
          child: Card(
            margin: EdgeInsets.all(8),
            child: Center(child: Text('列表项 $index')),
          ),
        );
      },
    ),
  ),
);

核心逻辑是:给纵向滚动的ListView一个确定的宽度边界,让它能正确计算自身布局,同时外层的SingleChildScrollView负责横向滚动的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:45:23