flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别

组件名称 用途/适合场景 是否懒加载 支持列表结构 用法复杂度
SingleChildScrollView 适用于内容数量不大、不重复的页面(如表单、静态内容) ❌ 否 ❌ 否 ⭐⭐
ListView 适用于垂直方向的长列表,自动滚动;适合展示大量数据 ✅ 支持 ✅ 是 ⭐⭐
ListView.builder 优化版 ListView,适合超长动态列表,按需懒加载构建 ✅ 强烈推荐 ✅ 是 ⭐⭐⭐
GridView 适用于网格状布局,如图片列表 ✅ 支持 ✅ 是(网格) ⭐⭐⭐
CustomScrollView 高级滚动视图,组合多个滚动子元素(如 SliverAppBar + SliverList) ✅ 支持 ✅ 是(灵活 ⭐⭐⭐⭐
PageView 水平翻页,用于页面轮播、引导页、Tab 内容切换等 ✅ 每页懒加载 ❌ 否 ⭐⭐
Scrollable(低阶) 最底层滚动组件,通常不建议直接使用,除非自定义滚动行为 ❓ 取决于实现 ⭐⭐⭐⭐⭐

常见使用场景说明

  1. SingleChildScrollView
    适合非列表型的页面,比如表单、图文页面。

    SingleChildScrollView(
    child: Column(
    children: [...],
    ),
    )

  • 不支持懒加载
  • 所有子项一次性渲染
  • 不建议用于长列表,性能差
  1. ListView / ListView.builder
    适合列表型页面(如聊天记录、新闻列表、商品列表等)

    ListView(
    children: [
    Text('Item 1'),
    Text('Item 2'),
    ],
    )

    // 更推荐
    ListView.builder(
    itemCount: 1000,
    itemBuilder: (context, index) => Text('Item $index'),
    )

  • 支持滚动
  • 支持懒加载(builder 模式)
  • 更适合长内容
  1. GridView
    用于网格状内容(如相册、九宫格)

    GridView.count(
    crossAxisCount: 2,
    children: [...],
    )

  • 有滚动能力
  • 可用于横向或纵向
  • 可指定网格数量、间距
  1. CustomScrollView + Slivers
    用于构建更复杂滚动效果,比如顶部可折叠 AppBar + 列表内容

    CustomScrollView(
    slivers: [
    SliverAppBar(
    expandedHeight: 200,
    flexibleSpace: FlexibleSpaceBar(title: Text('标题')),
    pinned: true,
    ),
    SliverList(
    delegate: SliverChildBuilderDelegate(
    (context, index) => ListTile(title: Text('Item $index')),
    childCount: 50,
    ),
    ),
    ],
    )

  • 高度可定制,滚动联动效果
  • 用于复杂的 UI 页面(如首页、动态页)
  1. PageView

    PageView(
    children: [
    Container(color: Colors.red),
    Container(color: Colors.green),
    ],
    )

  • 适用于引导页、卡片轮播、Tab 页
  • 支持左右/上下滑动
  • 支持手势控制、自动翻页

总结建议

页面类型 推荐滚动组件
表单、静态信息页面 SingleChildScrollView
聊天、列表、动态加载页面 ListView.builder
图片网格、宫格商品 GridView
首页、复杂滑动结构页面 CustomScrollView
引导页、卡片轮播 PageView
相关推荐
IT_陈寒2 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen2 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher3 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙3 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
牧艺3 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
jump_jump4 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
红尘散仙4 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
袋鼠云数栈UED团队4 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
袋鼠云数栈前端4 小时前
一套 Spec-First 的 AI 编程工作流
前端·ai+
angerdream5 小时前
Android手把手编写儿童手机远程监控App之vue3 路由守卫
前端