Flutter分组列表插件z_grouped_list的使用
Flutter分组列表插件z_grouped_list的使用
特性
- 支持列表视图和网格视图。
- 可以将数据分成不同的组。
- 可以按升序或降序排列数据。
- 每个组可以有唯一的头部。
安装
在你的 pubspec.yaml
文件的 dependencies:
部分添加以下行:
dependencies:
z_grouped_list: <最新版本>
然后在 Dart 代码中导入它:
import 'package:z_grouped_list/z_grouped_list.dart';
使用方法
重要提示!请确保你的代码被 Expanded
或 SizedBox
包裹。
简单列表实现:
ZGroupedList(
// 你的项目列表
items: books,
// 你要根据什么元素进行排序?
sortBy: (item) {
int year = item['year'];
return year;
},
// 项目小部件
itemBuilder: (context, item) {
String? name = item['name'];
return Text(name ?? "empty"); // 如果 name 为空则显示 "empty"
},
// 组分隔符小部件
groupSeparatorBuilder: (year) {
return Text(year.toString());
},
),
网格列表实现:
ZGroupedList.grid(
// 每行显示3个项目
crossAxisCount: 3,
// 所有的项目列表
items: books,
// 你要根据什么元素进行排序?
sortBy: (item) {
int year = item['year'];
return year;
},
// 项目小部件
itemBuilder: (context, item) {
String? name = item['name'];
return Text(name ?? "empty"); // 如果 name 为空则显示 "empty"
},
// 组分隔符小部件
groupSeparatorBuilder: (year) {
return Text(year.toString());
},
// 自定义网格委托(可选)
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 80,
childAspectRatio: 5 / 9,
crossAxisSpacing: 25,
mainAxisSpacing: 15,
),
),
参数说明
对于普通列表:
名称 | 描述 | 是否必须 | 默认值 |
---|---|---|---|
items | 显示在列表中的数据列表 | 是 | - |
sortBy | 将元素映射到其分组值的函数 | 是 | - |
itemBuilder | 构建项目小部件的函数 | 是 | - |
groupSeparatorBuilder | 构建分组分隔符小部件的函数 | 是 | - |
descendingOrder | 数据是否按降序组织 | 否 | true |
对于网格列表:
名称 | 描述 | 是否必须 | 默认值 |
---|---|---|---|
crossAxisCount | 每行有多少个项目 | 否 | 1 |
gridDelegate | 传递自定义网格委托 | 否 | - |
示例代码
import 'package:flutter/material.dart';
import 'package:z_grouped_list/z_grouped_list.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
// 示例书籍列表
static const List<Map<String, dynamic>> _books = [
{"name": "Atomic Habits", "year": 2018},
{"name": "The Miracle Morning", "year": 2018},
{"name": "Jurassic Park", "year": 2019},
];
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text("Grouped List"),
),
body: Column(
children: [
Expanded(
child: ZGroupedList(
// 所有的项目列表
items: _books,
// 你要根据什么元素进行排序?
sortBy: (item) {
int year = item['year'];
return year;
},
// 项目小部件
itemBuilder: (context, item) {
String? name = item['name'];
return Text(name ?? "empty"); // 如果 name 为空则显示 "empty"
},
// 组分隔符小部件
groupSeparatorBuilder: (year) {
return Text(year.toString());
},
),
),
],
),
),
);
}
}
更多关于Flutter分组列表插件z_grouped_list的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter分组列表插件z_grouped_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
z_grouped_list
是一个用于 Flutter 的分组列表插件,它可以帮助你轻松地创建带有分组标题的列表。这个插件非常适合展示需要按类别分组的数据,例如联系人列表、商品分类等。
安装
首先,你需要在 pubspec.yaml
文件中添加 z_grouped_list
插件的依赖:
dependencies:
flutter:
sdk: flutter
z_grouped_list: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
z_grouped_list
的核心是 GroupedListView
组件,它允许你将数据分组并在列表中显示。以下是一个简单的示例,展示了如何使用 GroupedListView
来显示一个分组列表。
import 'package:flutter/material.dart';
import 'package:z_grouped_list/z_grouped_list.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Grouped List Example'),
),
body: GroupedListViewExample(),
),
);
}
}
class GroupedListViewExample extends StatelessWidget {
// 示例数据
final List<Map<String, String>> _elements = [
{"name": "Apple", "group": "Fruits"},
{"name": "Banana", "group": "Fruits"},
{"name": "Orange", "group": "Fruits"},
{"name": "Carrot", "group": "Vegetables"},
{"name": "Broccoli", "group": "Vegetables"},
{"name": "Tomato", "group": "Vegetables"},
{"name": "Beef", "group": "Meat"},
{"name": "Chicken", "group": "Meat"},
{"name": "Pork", "group": "Meat"},
];
[@override](/user/override)
Widget build(BuildContext context) {
return GroupedListView<dynamic, String>(
elements: _elements,
groupBy: (element) => element['group']!,
groupSeparatorBuilder: (String groupByValue) => Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
groupByValue,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
),
itemBuilder: (context, element) {
return Card(
elevation: 8.0,
margin: EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0),
child: ListTile(
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
title: Text(element['name']!),
leading: Icon(Icons.food_bank),
),
);
},
itemComparator: (item1, item2) => item1['name']!.compareTo(item2['name']!), // optional
useStickyGroupSeparators: true, // optional
floatingHeader: true, // optional
order: GroupedListOrder.ASC, // optional
);
}
}