首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 零基础入门(四十六):高级列表与滚动优化 —— Sliver 与长列表性能实战

Flutter 零基础入门(四十六):高级列表与滚动优化 —— Sliver 与长列表性能实战

作者头像
LarryLan
发布2026-03-30 18:04:49
发布2026-03-30 18:04:49
80
举报

高级列表与滚动优化 —— Sliver 与长列表性能实战

到目前为止,你已经掌握了:

  • 多页面 App 架构与导航
  • 列表刷新与分页
  • 表单输入与校验
  • 动画、主题与视觉元素

但是在实际项目中,列表数据量可能很大,如果处理不当会出现:

  • 卡顿
  • 滚动不流畅
  • 内存占用过高

本篇我们将学习 Flutter 高级列表与滚动优化技巧


一、ListView 性能优化

1️⃣ 构建长列表

代码语言:javascript
复制
ListView.builder(
  itemCount: ,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text('条目 $index'),
    );
  },
)

📌 说明:

  • ListView.builder → 按需构建,性能比 ListView + children 高
  • 长列表性能优化必用 builder

2️⃣ 使用 const / Key 优化

代码语言:javascript
复制
ListTile(
  key: ValueKey(index),
  title: Text('条目 $index'),
)
  • 为列表元素添加 Key
  • 避免滚动时 Widget 重建

3️⃣ 分页加载(懒加载)

代码语言:javascript
复制
ScrollController _controller = ScrollController();

_controller.addListener(() {
  if (_controller.position.pixels == _controller.position.maxScrollExtent) {
    // 到底部,加载更多数据
  }
});

📌 技巧:

  • 使用 ScrollController 监听滚动位置
  • 分页加载 → 避免一次性加载过多数据

二、Sliver 基础

Sliver 系列组件是 可滚动区域的可伸缩、可组合布局

1️⃣ CustomScrollView + SliverList

代码语言:javascript
复制
CustomScrollView(
  slivers: [
    SliverAppBar(
      pinned: true,
      expandedHeight: 200,
      flexibleSpace: FlexibleSpaceBar(
        title: Text('Sliver 示例'),
        background: Image.asset(
          'assets/images/flutter_logo.png',
          fit: BoxFit.cover,
        ),
      ),
    ),
    SliverList(
      delegate: SliverChildBuilderDelegate(
        (context, index) => ListTile(title: Text('条目 $index')),
        childCount: 50,
      ),
    ),
  ],
)

📌 功能解析:

  • SliverAppBar → 可伸缩 AppBar
  • SliverList → 高性能长列表
  • Sliver 与 CustomScrollView 结合,可做复杂滚动效果

2️⃣ SliverGrid 网格布局

代码语言:javascript
复制
SliverGrid(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
    mainAxisSpacing: 10,
    crossAxisSpacing: 10,
    childAspectRatio: 1,
  ),
  delegate: SliverChildBuilderDelegate(
    (context, index) => Container(
      color: Colors.blue[100 * ((index % ) + )],
      child: Center(child: Text('Item $index')),
    ),
    childCount: 20,
  ),
)

📌 功能:

  • 高性能网格布局
  • 可组合其他 Sliver 组件

三、滚动监听与滚动位置管理

代码语言:javascript
复制
ScrollController _scrollController = ScrollController();

_scrollController.addListener(() {
  print('当前滚动位置: ${_scrollController.position.pixels}');
});
  • 可用于分页加载、回到顶部按钮、滚动动画

四、常见滚动优化技巧

  1. 使用 ListView.builder / SliverChildBuilderDelegate → 按需构建
  2. 使用 const / Key 避免重复重建
  3. 分页加载 + 占位 / Loading → 避免一次性加载全部数据
  4. 避免在 itemBuilder 中做复杂计算 → 提前处理数据
  5. 使用缓存网络图片cached_network_image

五、完整示例:Sliver + 分页列表

代码语言:javascript
复制
class SliverListPage extends StatefulWidget {
  @override
  _SliverListPageState createState() => _SliverListPageState();
}

class _SliverListPageState extends State<SliverListPage> {
  final ScrollController _controller = ScrollController();
  List<int> _items = List.generate(20, (index) => index);

  @override
  void initState() {
    super.initState();
    _controller.addListener(() {
      if (_controller.position.pixels == _controller.position.maxScrollExtent) {
        // 加载更多
        setState(() {
          _items.addAll(List.generate(, (index) => _items.length + index));
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        controller: _controller,
        slivers: [
          SliverAppBar(
            pinned: true,
            expandedHeight: 150,
            flexibleSpace: FlexibleSpaceBar(title: Text('Sliver分页列表')),
          ),
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (context, index) {
                return ListTile(title: Text('条目 ${_items[index]}'));
              },
              childCount: _items.length,
            ),
          ),
        ],
      ),
    );
  }
}

📌 功能总结:

  • SliverAppBar 可伸缩
  • SliverList 高性能长列表
  • 滚动到底自动加载更多数据
  • 分页 + Sliver + 高性能列表完美结合

六、常见坑

❌ ListView / Column 直接嵌套长列表 → 滚动冲突 ❌ SliverChildListDelegate / children 太多 → 性能下降 ❌ 不释放 ScrollController → 内存泄漏 ❌ itemBuilder 内做复杂计算 → 卡顿

📌 建议:

  • 长列表 + Sliver 或 builder 构建
  • ScrollController 记得 dispose
  • 分页 + 占位 + 缓存优化

七、本篇你真正掌握了什么?

你已经学会:

  • ListView.builder 与长列表性能优化
  • 分页加载与 ScrollController 使用
  • Sliver 基础组件(SliverList / SliverGrid / SliverAppBar)
  • 滚动监听与位置管理
  • 高性能列表与滚动优化技巧

📌 到这里为止:

你的 App 已经可以显示大量数据并保持流畅滚动


八、一句话总结

Sliver + CustomScrollView 高性能长列表 + 网格布局 分页加载 + 滚动监听 App 列表性能与交互优化


🔜 下一篇预告

《Flutter 零基础入门(四十七):Flutter 插件与第三方库使用 —— 扩展 App 功能实战》

下一篇我们将学习:

  • Flutter 插件的使用方式
  • 第三方库集成(shared_preferences / url_launcher 等)
  • 插件调用示例和常见注意事项
  • 让你的 App 功能更丰富、可扩展

🚀 让你的 App 从入门到具备实用功能能力

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Larry的Hub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 高级列表与滚动优化 —— Sliver 与长列表性能实战
    • 一、ListView 性能优化
      • 1️⃣ 构建长列表
      • 2️⃣ 使用 const / Key 优化
      • 3️⃣ 分页加载(懒加载)
    • 二、Sliver 基础
      • 1️⃣ CustomScrollView + SliverList
      • 2️⃣ SliverGrid 网格布局
    • 三、滚动监听与滚动位置管理
    • 四、常见滚动优化技巧
    • 五、完整示例:Sliver + 分页列表
    • 六、常见坑
    • 七、本篇你真正掌握了什么?
    • 八、一句话总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档