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
相关产品推荐
相关产品推荐

