Flutter实现悬浮分组列表功能
在本篇博客中,我们将介绍如何使用 Flutter 实现一个带有分组列表的应用程序。我们将通过 CustomScrollView
和 Sliver
组件来实现该功能。
需求
我们需要实现一个分组列表,分组包含固定的标题和若干个列表项。具体分组如下:
- 水果
- 动物
- 职业
- 菜谱
每个分组包含若干个项目,例如水果组包含苹果、香蕉等。
效果
实现思路
- 定义数据模型:创建
ItemBean
类来表示每个分组的数据。 - 构建主页面:使用
CustomScrollView
和Sliver
组件构建主页面,其中包含多个分组。 - 实现固定标题:通过自定义
SliverPersistentHeaderDelegate
实现固定标题。
实现代码
以下是实现代码:
import 'package:flutter/material.dart'; /// 数据源 /// https://github.com/yixiaolunhui/flutter_xy class ItemBean { final String groupName; final List<String> items; const ItemBean({required this.groupName, this.items = const []}); static List<ItemBean> get groupListData => const [ ItemBean(groupName: '水果', items: [ '苹果', '香蕉', '橙子', '葡萄', '芒果', '梨', '桃子', '草莓', '西瓜', '柠檬', '菠萝', '樱桃', '蓝莓', '猕猴桃', '李子', '柿子', '杏', '杨梅', '石榴', '木瓜' ]), ItemBean(groupName: '动物', items: [ '狗', '猫', '狮子', '老虎', '大象', '熊', '鹿', '狼', '狐狸', '猴子', '企鹅', '熊猫', '袋鼠', '海豚', '鲨鱼', '斑马', '长颈鹿', '鳄鱼', '孔雀', '乌龟' ]), ItemBean(groupName: '职业', items: [ '医生', '护士', '教师', '工程师', '程序员', '律师', '会计', '警察', '消防员', '厨师', '司机', '飞行员', '科学家', '记者', '设计师', '作家', '演员', '音乐家', '画家', '摄影师' ]), ItemBean(groupName: '菜谱', items: [ '红烧肉', '糖醋排骨', '宫保鸡丁', '麻婆豆腐', '鱼香肉丝', '酸辣汤', '蒜蓉菠菜', '回锅肉', '水煮鱼', '烤鸭', '蛋炒饭', '蚝油生菜', '红烧茄子', '西红柿炒鸡蛋', '油焖大虾', '香菇鸡汤', '酸菜鱼', '麻辣香锅', '铁板牛肉', '干煸四季豆' ]), ]; } /// 分组列表 class GroupListPage extends StatelessWidget { const GroupListPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('分组列表')), body: CustomScrollView( slivers: ItemBean.groupListData.map(_buildGroup).toList(), ), ); } Widget _buildGroup(ItemBean itemBean) { return SliverMainAxisGroup( slivers: [ SliverPersistentHeader( pinned: true, delegate: HeaderDelegate(itemBean.groupName), ), SliverList( delegate: SliverChildBuilderDelegate( (_, index) => _buildItemByUser(itemBean.items[index]), childCount: itemBean.items.length, ), ), ], ); } Widget _buildItemByUser(String item) { return Container( alignment: Alignment.center, height: 50, child: Row( children: [ const Padding( padding: EdgeInsets.only(left: 20, right: 10.0), child: FlutterLogo(size: 30), ), Text( item, style: const TextStyle(fontSize: 16), ), ], ), ); } } class HeaderDelegate extends SliverPersistentHeaderDelegate { final String title; const HeaderDelegate(this.title); @override Widget build( BuildContext context, double shrinkOffset, bool overlapsContent) { return Container( alignment: Alignment.centerLeft, color: Colors.grey, padding: const EdgeInsets.only(left: 20), height: 40, child: Text(title, style: const TextStyle(fontSize: 16)), ); } @override double get maxExtent => 40; @override double get minExtent => 40; @override bool shouldRebuild(covariant HeaderDelegate oldDelegate) { return title != oldDelegate.title; } }
通过以上代码,我们实现了一个简单的 Flutter 分组列表应用。每个分组都有固定的标题,点击标题可以展开或收起组内的项目。希望这篇博客对你有所帮助!
详情 :github.com/yixiaolunhui/flutter_xy
到此这篇关于Flutter-实现悬浮分组列表的文章就介绍到这了,更多相关Flutter悬浮分组列表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android调用系统摄像头拍照并显示在ImageView上
这篇文章主要为大家详细介绍了Android调用系统摄像头拍照并显示在ImageView上,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-04-04Android开发使用Drawable绘制圆角与圆形图案功能示例
这篇文章主要介绍了Android开发使用Drawable绘制圆角与圆形图案功能,结合具体实例形式分析了Drawable绘制圆角矩形的实现步骤与使用方法,需要的朋友可以参考下2017-10-10浅谈Android为RecyclerView增加监听以及数据混乱的小坑
下面小编就为大家带来一篇浅谈Android为RecyclerView增加监听以及数据混乱的小坑。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-04-04Android 动画之RotateAnimation应用详解
本节讲解旋转动画效果RotateAnimation方法的应用,有需要的朋友可以参考下2012-12-12FragmentStatePagerAdapter保存恢复下拉刷新Fragment内存数据
这篇文章主要为大家介绍了FragmentStatePagerAdapter保存恢复下拉刷新Fragment内存数据分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-02-02
最新评论