| 分类 flutter  | 标签 Flutter  列表 

title

引言

ListView 是 Flutter 的列表组件,支持多种构造方式。ListView(children: […]) 一次性构建所有子项,适合短列表;ListView.builder 按需构建,只构建可见项,适合长列表;ListView.separated 支持 itemBuilder 和 separatorBuilder,便于添加分隔线。CustomScrollView 配合 Sliver 可实现复杂滚动效果(如头部折叠、粘性标题)。GridView 用于网格布局,同样有 builder 和 separated 变体。本文将介绍列表的优化、懒加载、分页加载以及 Sliver 的常见用法。

为什么使用 ListView.builder

ListView(children: […]) 会立即构建所有子 Widget,若列表有上千项会导致内存和性能问题。ListView.builder 的 itemBuilder 仅在子项即将进入视口时调用,离开视口后子 Widget 可被回收,从而支持无限长列表。itemCount 可省略表示无限列表,但需注意滚动到末尾时的加载更多逻辑。

ListView.builder

itemBuilder 接收 context 和 index,返回对应项的 Widget。itemCount 限制列表长度。addAutomaticKeepAlives、addRepaintBoundaries 等可影响子项的生命周期和重绘边界,通常使用默认值即可。对于分页加载,可监听 ScrollController 的 scroll 事件,在接近底部时加载下一页,或使用 scrollable_positioned_list、infinite_scroll_pagination 等库。

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index].title),
      subtitle: Text(items[index].subtitle),
    );
  },
)

// 带分隔线
ListView.separated(
  itemCount: items.length,
  separatorBuilder: (_, __) => Divider(),
  itemBuilder: (context, index) => ListTile(title: Text(items[index])),
)

总结

使用 builder 可避免一次性构建所有子项,提升长列表性能。对于分页、下拉刷新等需求,可结合 RefreshIndicator、ScrollController 或专用分页库实现。CustomScrollView 与 Sliver 可满足更复杂的滚动布局需求。


上一篇     下一篇