在本篇博客中,我们将介绍如何使用 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悬浮分组列表内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论