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

Flutter中实现命名分区后的列表行应使用哪些Widget?

安卓联系人分组列表示例效果

Flutter实现分区列表的Widget选型

要实现安卓联系人这种「分区标题+下方多行列表项」的效果,根据交互复杂度选对应组件即可:

  • 无吸顶需求、数据量较小的简单场景:直接用ListView
    按顺序把每个分区的标题Widget、该分区下所有列表项Widget塞进ListView的children数组就能实现基础效果。分区标题可以用带边距的Text组件自定义样式,匹配* Favorites这类标题显示效果;每一行内容项直接用内置的ListTile组件,能快速对齐原生联系人的行布局,自带头像位、标题、副标题、尾置操作位的结构,不用手动拼接行组件。
  • 需要滚动吸顶效果、数据量较大的场景:用CustomScrollView搭配Sliver系列组件
    这套组合长列表渲染性能更好,也能实现原生联系人那种滚动时当前分区标题固定在顶部、下一个分区上滑把旧标题顶走的经典交互:
    • 不需要吸顶的普通分区标题,用SliverToBoxAdapter包裹标题Widget即可
    • 分区下的列表项如果数量较多,用SliverList渲染,自动触发子项复用,避免长列表卡顿
    • 需要吸顶的分区标题,用SliverPersistentHeader实现,可自定义标题高度、样式和吸顶停留逻辑
  • 如果不想手动编写Sliver的吸顶判断逻辑,也可以直接用成熟的开源粘性头封装组件,几行代码就能完成分区吸顶效果,不用自己处理滚动位置计算。

最简实现示例代码:

ListView(
  children: [
    // 收藏分区标题
    Padding(
      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
      child: Text(
        '* Favorites',
        style: TextStyle(fontWeight: FontWeight.w600, color: Colors.black54),
      ),
    ),
    // 分区下的联系人项
    const ListTile(
      leading: CircleAvatar(child: Text('T')),
      title: Text('TechBone net'),
    ),
    const ListTile(
      leading: CircleAvatar(child: Text('张')),
      title: Text('张三'),
    ),
    // A开头联系人分区标题
    Padding(
      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
      child: Text(
        'A',
        style: TextStyle(fontWeight: FontWeight.w600, color: Colors.black54),
      ),
    ),
    const ListTile(
      leading: CircleAvatar(child: Text('阿')),
      title: Text('阿明'),
    ),
  ],
)

如果要实现联系人页常见的侧边字母索引导航功能,搭配ScrollController监听列表滚动位置,联动侧边字母栏的选中状态即可完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:42:17