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

Flutter 竖向ListView嵌套横向ListView滚动异常问题求助

Flutter嵌套列表(纵向+横向)滚动无响应修复方案

问题根源

  • 外层纵向ListView冗余属性导致渲染性能差、滚动优先级判断错误
  • 子组件横向滚动区域存在无效高度约束,导致手势识别区域异常
  • 滚动物理效果配置不适配嵌套滚动场景,手势被意外截断

修复代码

外层纵向ListView代码修改

Expanded(
  flex: 5,
  // 移除冗余的Container固定高度,Expanded会自动填充可用空间
  child: ListView.builder(
    // 移除shrinkWrap: true,嵌套在Expanded中不需要自适应高度,开启会导致全量渲染卡顿
    physics: const AlwaysScrollableScrollPhysics(), // 明确指定滚动物理效果,保证纵向滚动优先级正常
    itemCount: skills.length,
    itemBuilder: (context, index){
      return CategoryHomeScreen(videosInSection: videoRecommended[skills[index]] ?? [], skill: skills[index]);
    }
  ),
)

子组件(横向滚动行)代码修改

return Column(
  mainAxisSize: MainAxisSize.min, // 明确列高度自适应子项,避免冗余布局
  children: [
    Padding(
      padding: EdgeInsets.fromLTRB(HomeBrain.headingPaddingLeftSide, 0, 0, 0),
      child: Text(
        widget.skill,
        style: Constants.subHeading,
      )
    ),
    // 横向滚动区域
    Container(
      height: HomeBrain.videoHeightBox +
          HomeBrain.sizeBetweenvideoAndSub +
          HomeBrain.videoHeight -
          HomeBrain.takeAwayFromContainerSizedOfVideoFram,
      width: double.infinity,
      // 移除高度为0的无效SizedBox,会导致手势识别区域计算错误
      child: ListView.builder(
        physics: const AlwaysScrollableScrollPhysics(), // 替换ClampingScrollPhysics,避免横向滚动手势被截断
        scrollDirection: Axis.horizontal,
        itemCount: widget.videosInSection.length,
        itemBuilder: (context, int index) {
          return ScreenTile(
            authorName: widget.videosInSection[index].userNameBy,
            pathToThumbnail: widget.videosInSection[index].thumbNailUrl,
            thumbnail: widget.videosInSection[index].thumbnail,
            pathToVideo: widget.videosInSection[index].videoUrl,
            profilePic: widget.videosInSection[index].profilePic,
            videoBrain: widget.videosInSection[index],
          );
        },
      ),
    ),
  ],
);

额外优化建议

  • 如果列表项数量超过20个,建议给纵向、横向的ListView都加addAutomaticKeepAlives: true,避免滚动时重复渲染子项
  • 若仍有偶发手势冲突,可给横向ListView添加key: PageStorageKey('horizontal_${widget.skill}'),保证滚动状态存储和手势识别的唯一性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:57:04