Flutter分组列表插件grouped_list的使用
Flutter分组列表插件grouped_list的使用
Grouped list package for Flutter
Flutter中的ListView
,其中列表项可以被分组成部分。
Features
- 支持空安全!
- 易于创建聊天对话框。
- 列表项可以在组中分离。
- 可以为组设置单独的标题。
- 几乎所有来自
ListView.builder
的字段都可用。
Getting Started
添加依赖
在您的pubspec.yaml
文件中添加此包:
dependencies:
grouped_list: ^6.0.0
在您的Dart文件中导入库:
import 'package:grouped_list/grouped_list.dart';
用GroupedListView
Widget 替代 ListView
创建:
GroupedListView<dynamic, String>(
elements: _elements,
groupBy: (element) => element['group'],
groupSeparatorBuilder: (String groupByValue) => Text(groupByValue),
itemBuilder: (context, dynamic element) => Text(element['name']),
itemComparator: (item1, item2) => item1['name'].compareTo(item2['name']), // optional
useStickyGroupSeparators: true, // optional
floatingHeader: true, // optional
order: GroupedListOrder.ASC, // optional
footer: Text("Widget at the bottom of list"), // optional
),
参数
名称 | 描述 | 是否必填 | 默认值 |
---|---|---|---|
elements |
您想要在列表中显示的数据列表 | 是 | - |
groupBy |
将元素映射到其分组值的函数 | 是 | - |
itemBuilder / indexedItemBuilder / interdependentItemBuilder / grouItemBuilder |
返回定义项目的Widget的函数。 * indexedItemBuilder 还提供当前索引。* interdependentItemBuilder 还提供前一个和下一个项目。* groupItemBuilder 提供该物品是否是组内的第一个或最后一个元素的信息。indexedItemBuilder 优于interdependentItemBuilder 和interdependentItemBuilder 优于itemBuilder 。 |
是,四个选一个 | - |
groupSeparatorBuilder / groupHeaderBuilder |
返回定义组标题的Widget的函数。虽然groupSeparatorBuilder 以groupBy 值作为参数,但groupHeaderBuilder 以整个元素作为参数。如果两者都已定义,则优先使用groupHeaderBuilder 。 |
是,两个选一个 | - |
groupStickyHeaderBuilder |
当useStickyGroupSeparators 为true时,返回定义粘性组头的Widget的函数。如果没有定义,则根据上述描述使用groupSeparatorBuilder 或groupHeaderBuilder 。 |
否 | - |
useStickyGroupSeparators |
当设置为true时,当前可见组的组头将固定在顶部 | 否 | false |
floatingHeader |
粘性组头是否浮动在列表上还是占用自己的空间 | 否 | false |
stickyHeaderBackgroundColor |
定义粘性头的背景颜色。仅当使用useStickyGroupSeparators 时使用 |
否 | Color(0xffF7F7F7) |
separator |
定义组内项目之间分隔符的Widget | 否 | 无分隔符 |
groupComparator |
用于定义组自定义排序。否则使用自然排序顺序 | 否 | - |
itemComparator |
用于定义每个组内元素的自定义排序。否则使用自然排序顺序 | 否 | - |
order |
更改为GroupedListOrder.DESC 以反转组排序 |
否 | GroupedListOrder.ASC |
footer |
列表底部的Widget | 否 | - |
ListView.builder
的所有字段也可以使用。
Highlight - SilverGroupedList
现在支持基于银色列表的分组列表。只需使用SilverGroupedListView
代替GroupedListView
。示例可以在example/lib/example_silver
下找到。
注意,GroupedListView
的一些选项目前在SilverGroupedListView
中不可用。
Highlight - Chat Dialog
轻松创建聊天对话框。
只需将选项reverse
设置为true
并将order
设置为GroupedListOrder.DESC
。完整示例可以在示例中找到。
列表将在初始状态下滚动到底部,因此滚动将与阅读方向相反。
示例代码
以下是完整的示例代码:
import 'package:flutter/material.dart';
import 'package:grouped_list/grouped_list.dart';
void main() => runApp(const MyApp());
List _elements = [
{'name': 'John', 'group': 'Team A'},
{'name': 'Will', 'group': 'Team B'},
{'name': 'Beth', 'group': 'Team A'},
{'name': 'Miranda', 'group': 'Team B'},
{'name': 'Mike', 'group': 'Team C'},
{'name': 'Danny', 'group': 'Team C'},
];
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const Text('Grouped List View Example'),
),
body: _createGroupedListView(),
),
);
}
_createGroupedListView() {
return GroupedListView<dynamic, String>(
elements: _elements,
groupBy: (element) => element['group'],
groupComparator: (value1, value2) => value2.compareTo(value1),
itemComparator: (item1, item2) => item1['name'].compareTo(item2['name']),
order: GroupedListOrder.DESC,
useStickyGroupSeparators: true,
groupSeparatorBuilder: (String value) => Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
value,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
itemBuilder: (c, element) {
return Card(
elevation: 8.0,
margin: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0),
child: SizedBox(
child: ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
leading: const Icon(Icons.account_circle),
title: Text(element['name']),
trailing: const Icon(Icons.arrow_forward),
),
),
);
},
);
}
}
通过以上内容,您可以了解如何使用grouped_list
插件来创建分组列表,并根据需要进行自定义。希望这对您有所帮助!
更多关于Flutter分组列表插件grouped_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分组列表插件grouped_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用grouped_list
插件来实现分组列表的示例代码。
首先,确保你已经在pubspec.yaml
文件中添加了grouped_list
依赖:
dependencies:
flutter:
sdk: flutter
grouped_list: ^4.0.0 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
接下来,下面是一个完整的示例代码,展示了如何使用grouped_list
来创建一个分组列表:
import 'package:flutter/material.dart';
import 'package:grouped_list/grouped_list.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Grouped List Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: GroupedListDemo(),
);
}
}
class GroupedListDemo extends StatefulWidget {
@override
_GroupedListDemoState createState() => _GroupedListDemoState();
}
class _GroupedListDemoState extends State<GroupedListDemo> {
final List<Map<String, dynamic>> _groupedItems = List.generate(20, (index) {
return {
'letter': index % 2 == 0 ? 'A' : 'B',
'name': 'Item ${index + 1}',
};
}).toList();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Grouped List Demo'),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: GroupedListView<Map<String, dynamic>, String>(
elements: _groupedItems,
groupBy: (element) => element['letter'] as String,
groupSeparatorBuilder: (String groupByValue) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text(
groupByValue,
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
);
},
itemBuilder: (context, element) {
return ListTile(
title: Text(element['name'] as String),
);
},
itemCount: _groupedItems.length,
order: GroupedListOrder.ASC, // or GroupedListOrder.DESC
),
),
);
}
}
代码解释:
-
依赖导入:
import 'package:grouped_list/grouped_list.dart';
-
数据源:
final List<Map<String, dynamic>> _groupedItems = List.generate(20, (index) { return { 'letter': index % 2 == 0 ? 'A' : 'B', 'name': 'Item ${index + 1}', }; }).toList();
这里我们创建了一个包含20个项目的列表,每个项目都有一个
letter
属性用于分组,以及一个name
属性作为显示内容。 -
GroupedListView:
GroupedListView<Map<String, dynamic>, String>( elements: _groupedItems, groupBy: (element) => element['letter'] as String, groupSeparatorBuilder: (String groupByValue) { return Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), child: Text( groupByValue, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), ); }, itemBuilder: (context, element) { return ListTile( title: Text(element['name'] as String), ); }, itemCount: _groupedItems.length, order: GroupedListOrder.ASC, // or GroupedListOrder.DESC )
elements
:传入数据源。groupBy
:指定如何分组,这里按letter
属性分组。groupSeparatorBuilder
:用于构建每个分组的头部。itemBuilder
:用于构建每个列表项。itemCount
:数据源的总长度。order
:指定分组排序顺序,可以是升序(GroupedListOrder.ASC
)或降序(GroupedListOrder.DESC
)。
这个示例展示了如何使用grouped_list
插件在Flutter中创建一个简单的分组列表。你可以根据需要调整数据源和UI样式。