Flutter分组滚动视图插件grouped_scroll_view的使用
Flutter分组滚动视图插件grouped_scroll_view的使用
grouped_scroll_view
grouped_scroll_view
是一个用于显示分组列表项的包。提供一个列表、分组器,它将作为一个 ListView
、GridView
或其他形式显示。支持在 scrollView
中使用复选框或单选按钮。
预览
分组网格 | 分组列表 | 网格切换编辑 | 列表切换编辑 |
---|---|---|---|
分组网格复选框 | 分组列表单选 | 网格复选框 | 列表单选 |
---|---|---|---|
开始使用
在您的 pubspec.yaml
文件中添加此包:
dependencies:
grouped_scroll_view: <latest_version>
功能特性
- 支持粘性头部、自定义分组器、自定义头部、自定义尾部
- 支持在
scrollView
中使用 复选框 或 单选按钮
使用示例
分组网格视图
GroupedScrollView.grid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
mainAxisSpacing: 5,
crossAxisSpacing: 5,
crossAxisCount: widget.crossAxisCount
),
groupedOptions: GroupedScrollViewOptions(
itemGrouper: (Person person) {
return person.birthYear;
},
stickyHeaderBuilder: (BuildContext context, int year, int groupedIndex) => Container(
color: Colors.white,
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints.tightFor(height: 30),
child: Text(
'$year',
style: const TextStyle(fontWeight: FontWeight.bold),
),
)
),
itemBuilder: (BuildContext context, Person item) {
return Container(
color: Colors.lightGreen,
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints.tightFor(width: 100),
child: Center(
child: Text(
item.name,
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
);
},
data: DataCache.instance.persons,
headerBuilder: (BuildContext context) => Column(
children: const [
Divider(thickness: 5,),
Center(
child: Text(
'CustomHeader',
style: TextStyle(fontWeight: FontWeight.bold),
),
),
Divider(thickness: 5,),
],
),
footerBuilder: (BuildContext context) => Column(
children: const [
Divider(thickness: 5,),
Center(
child: Text(
'CustomFooter',
style: TextStyle(fontWeight: FontWeight.bold),
),
),
Divider(thickness: 5,),
],
),
)
分组列表视图
GroupedScrollView.list(
groupedOptions: GroupedScrollViewOptions(
itemGrouper: (Person person) {
return person.birthYear;
},
stickyHeaderBuilder: (BuildContext context, int year, int groupedIndex) => Container(
color: Colors.white,
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints.tightFor(height: 30),
child: Text(
'$year',
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
),
itemBuilder: (BuildContext context, Person item) {
return Container(
constraints: const BoxConstraints.expand(height: 35),
child: Column(
children: [
Container(
constraints: const BoxConstraints.expand(height: 30),
color: Colors.lightGreen,
child: Center(
child: Text(
item.name,
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
),
],
),
);
},
data: DataCache.instance.persons,
headerBuilder: (BuildContext context) => Column(
children: const [
Divider(thickness: 5,),
Center(
child: Text(
'CustomHeader',
style: TextStyle(fontWeight: FontWeight.bold),
),
),
Divider(thickness: 5,),
],
),
footerBuilder: (BuildContext context) => Column(
children: const [
Divider(thickness: 5,),
Center(
child: Text(
'CustomFooter',
style: TextStyle(fontWeight: FontWeight.bold),
),
),
Divider(thickness: 5,),
],
),
)
复选框和单选按钮支持
如果列表需要支持复选框或单选按钮,请设置 toggleEnabled
为 true
。
final controller = GroupedToggleController(
toggleType: GroupedToggleType.checkbox,
onToggleChanged: (int idx, bool selected) {
// ...
},
toggleStyle: GroupedToggleStyle(),
);
GroupedScrollViewWithToggle.grid({
data: List<T>,
itemBuilder: (BuildContext context, T item) { /*...*/},
toggleController: controller,
toggleEnabled: true,
// ...
});
// dispose
controller.dispose();
完整示例代码
以下是一个完整的示例代码,展示了如何在一个Flutter应用中使用 grouped_scroll_view
插件。
import 'package:flutter/material.dart';
import 'package:grouped_scroll_view/grouped_scroll_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Grouped Scroll View Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(title: 'Grouped Scroll View Demo'),
);
}
}
class HomePage extends StatefulWidget {
final String title;
HomePage({required this.title});
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final List<Person> persons = [
Person(name: "Alice", birthYear: 1990),
Person(name: "Bob", birthYear: 1990),
Person(name: "Charlie", birthYear: 1991),
Person(name: "David", birthYear: 1992),
Person(name: "Eve", birthYear: 1992),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: GroupedScrollView.list(
groupedOptions: GroupedScrollViewOptions(
itemGrouper: (Person person) {
return person.birthYear;
},
stickyHeaderBuilder: (BuildContext context, int year, int groupedIndex) => Container(
color: Colors.white,
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints.tightFor(height: 30),
child: Text(
'$year',
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
),
itemBuilder: (BuildContext context, Person item) {
return ListTile(
title: Text(item.name),
);
},
data: persons,
),
);
}
}
class Person {
final String name;
final int birthYear;
Person({required this.name, required this.birthYear});
}
通过以上内容,您可以轻松地在Flutter项目中使用 grouped_scroll_view
插件来创建分组滚动视图,并根据需要添加复选框或单选按钮功能。
更多关于Flutter分组滚动视图插件grouped_scroll_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分组滚动视图插件grouped_scroll_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用Flutter的grouped_scroll_view
插件来实现分组滚动视图的示例代码。请注意,grouped_scroll_view
并非Flutter官方提供的标准插件,因此假设你提到的grouped_scroll_view
是一个第三方库或者一个假设的插件名称。在实际项目中,可能需要找到一个类似的第三方库或自行实现该功能。为了演示目的,这里将展示一个类似分组滚动视图的基本实现。
首先,你需要确保你的Flutter项目中已经添加了必要的依赖(尽管grouped_scroll_view
不是官方插件,但这里我们会展示一个类似的实现思路)。然后,你可以创建一个自定义的分组滚动视图。
示例代码
- 创建一个Flutter项目(如果还没有的话):
flutter create grouped_scroll_view_example
cd grouped_scroll_view_example
- 修改
pubspec.yaml
文件(如果需要额外的依赖,比如用于数据展示的插件,这里为了简单起见,我们假设不需要额外依赖):
dependencies:
flutter:
sdk: flutter
- 创建自定义分组滚动视图:
在lib
目录下创建一个新的文件,比如grouped_scroll_view.dart
,并在其中实现分组滚动视图。
import 'package:flutter/material.dart';
class GroupedScrollView extends StatelessWidget {
final List<String> groupTitles;
final Map<String, List<String>> groupItems;
GroupedScrollView({required this.groupTitles, required this.groupItems});
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
for (var i = 0; i < groupTitles.length; i++)
SliverStickyHeader(
header: Container(
color: Colors.grey[300],
padding: EdgeInsets.symmetric(horizontal: 16.0),
alignment: Alignment.centerLeft,
child: Text(
groupTitles[i],
style: TextStyle(fontWeight: FontWeight.bold),
),
),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
final group = groupTitles[i];
final item = groupItems[group]![index];
return ListTile(
title: Text(item),
);
},
childCount: groupItems[groupTitles[i]]!.length,
),
),
),
],
);
}
}
- 使用自定义分组滚动视图:
在lib/main.dart
文件中使用你创建的GroupedScrollView
组件。
import 'package:flutter/material.dart';
import 'grouped_scroll_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Grouped Scroll View Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
final List<String> groupTitles = ['Group 1', 'Group 2', 'Group 3'];
final Map<String, List<String>> groupItems = {
'Group 1': ['Item 1.1', 'Item 1.2', 'Item 1.3'],
'Group 2': ['Item 2.1', 'Item 2.2', 'Item 2.3', 'Item 2.4'],
'Group 3': ['Item 3.1', 'Item 3.2'],
};
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Grouped Scroll View Example'),
),
body: GroupedScrollView(
groupTitles: groupTitles,
groupItems: groupItems,
),
);
}
}
解释
- GroupedScrollView:这是一个自定义的StatelessWidget,它接受两个参数:
groupTitles
(分组标题列表)和groupItems
(一个映射,将每个分组标题映射到其项列表)。 - SliverStickyHeader:用于创建粘性头部效果。在这个例子中,每个分组的标题都会作为粘性头部。
- SliverList:用于展示每个分组中的项。
这个示例展示了如何使用Flutter的基本组件来创建一个类似分组滚动视图的效果。如果你确实在寻找一个名为grouped_scroll_view
的第三方插件,请查阅其官方文档以获取更具体的用法。