Flutter分组选择插件group_select的使用
Flutter分组选择插件group_select的使用
简介
group_select
是一个用于Flutter的多选组件,支持分组选择。你可以通过创建控制器来控制组件的行为,并且可以指定自定义类型。
DEMO
查看在线演示:http://group-select.esquilodigital.com.br/#/
开始使用
首先,导入包:
import 'package:group_select/group_select.dart';
使用方法
要使用该组件,需要创建一个控制器,并可以为控制器和组件指定自定义类型。
创建控制器
final controller = SelectGroupController<int>(
lang: LangBadge.enUS,
multiple: false,
dark: false,
);
final groupController = SelectGroupController<String>();
初始化组件
初始化组件时需要传递一个控制器:
带有项目的组件
GroupSelect<int>(
activeColor: Colors.red,
title: 'With items',
controller: controller,
items: [
Item(title: 'Item 1', value: 1),
Item(title: 'Item 2', value: 2),
Item(title: 'Item 3', value: 3),
Item(title: 'Item 4', value: 4),
Item(title: 'Item 5', value: 5),
],
)
带有分组项目的组件
GroupSelect<String>(
title: 'With groups items',
activeColor: Colors.green,
controller: groupController,
onChange: (values) {
print(values);
},
groups: [
Group(
title: 'Grupo 1',
id: '1',
items: [
Item(title: 'Item 1', value: '1'),
Item(title: 'Item 2', value: '2'),
Item(title: 'Item 3', value: '3'),
Item(title: 'Item 4', value: '4'),
Item(title: 'Item 5', value: '5'),
],
),
Group(
title: 'Grupo 2',
id: '2',
items: [
Item(title: 'Item 1', value: '6'),
Item(title: 'Item 2', value: '7'),
Item(title: 'Item 3', value: '8'),
Item(title: 'Item 4', value: '9'),
Item(title: 'Item 5', value: '10'),
],
),
],
)
注意:每个分组需要有一个唯一的ID。
属性说明
分组
分组接收项目,并且必须具有唯一ID:
Group(
title: 'Grupo 2',
id: '2',
items: [
Item(title: 'Item 1', value: '6'),
Item(title: 'Item 2', value: '7'),
Item(title: 'Item 3', value: '8'),
Item(title: 'Item 4', value: '9'),
Item(title: 'Item 5', value: '10'),
],
)
项目
项目可以包含一个 leading
,它可以是任何Widget:
Item(
title: 'Item 4',
value: '4',
leading: const Icon(Icons.circle),
);
Item(
title: 'Item 4',
value: '4',
leading: Image.asset('path/to/image'),
);
onChange 回调
当选择项发生变化时始终会被调用:
GroupSelect<T>(
title: 'With groups items',
activeColor: Colors.green,
controller: groupController,
onChange: (dynamic values) {
print(values);
}
// ... 其他代码省略
)
activeColor 属性
可以更改活动状态下的徽章和复选框的颜色:
GroupSelect<String>(
title: 'With groups items',
activeColor: Colors.green,
);
dark 模式
启用组件的暗模式。请参阅在线演示中的示例。
控制器
获取选中值
如果启用了多项选择,则返回值是一个列表:
dynamic get value;
重置值
使用以下方法清除值:
void resetValues();
示例Demo
以下是一个完整的示例代码,展示了如何在Flutter应用中使用 group_select
插件:
import 'package:flutter/material.dart';
import 'package:group_select/group_select.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(primarySwatch: Colors.blue),
home: const HomePage(title: 'Flutter Demo Home Page'),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final itemController = SelectGroupController<int>();
final groupController = SelectGroupController<String>(
dark: true,
lang: LangBadge.ptBR,
);
final itemControllerSingle = SelectGroupController<int>(multiple: false);
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
bottomNavigationBar: ElevatedButton(
child: const Padding(
padding: EdgeInsets.all(10.0),
child: Text(
'Reset',
style: TextStyle(fontSize: 20),
),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.blue),
),
onPressed: () {
itemController.resetValues();
groupController.resetValues();
itemControllerSingle.resetValues();
},
),
body: SingleChildScrollView(
child: Column(
children: [
GroupSelect<String>(
title: 'With groups items',
activeColor: Colors.green,
controller: groupController,
onChange: (values) {},
groups: [_groupSelectWithGroup],
),
_groupSelectWithItems,
_groupSelectSingleWithItems,
],
),
),
),
);
}
Group get _groupSelectWithGroup {
return Group(
title: 'Grupo 1',
id: '1',
items: [
Item(title: 'Item 1', value: '1', leading: const Icon(Icons.circle)),
Item(title: 'Item 2', value: '2', leading: const Icon(Icons.circle)),
Item(title: 'Item 3', value: '3', leading: const Icon(Icons.circle)),
Item(title: 'Item 4', value: '4', leading: const Icon(Icons.circle)),
Item(title: 'Item 5', value: '5'),
],
);
}
Widget get _groupSelectWithItems {
return GroupSelect<int>(
activeColor: Colors.red,
title: 'With items',
controller: itemController,
items: [
Item(title: 'Item 1', value: 1),
Item(title: 'Item 2', value: 2),
Item(title: 'Item 3', value: 3),
Item(title: 'Item 4', value: 4),
Item(title: 'Item 5', value: 5),
],
);
}
Widget get _groupSelectSingleWithItems {
return GroupSelect<int>(
activeColor: Colors.red,
title: 'Single With items',
controller: itemControllerSingle,
items: [
Item(title: 'Item 1', value: 1),
Item(title: 'Item 2', value: 2),
Item(title: 'Item 3', value: 3),
Item(title: 'Item 4', value: 4),
Item(title: 'Item 5', value: 5),
],
);
}
}
以上示例展示了一个带有分组选择、单选和重置功能的完整Flutter应用程序。
更多关于Flutter分组选择插件group_select的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分组选择插件group_select的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用group_select
插件的示例代码。这个插件通常用于实现分组选择功能,比如在一个表单中选择多个选项,这些选项被分组显示。
首先,确保你已经在pubspec.yaml
文件中添加了group_select
依赖:
dependencies:
flutter:
sdk: flutter
group_select: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
接下来,下面是一个完整的示例代码,展示如何在Flutter应用中使用group_select
插件:
import 'package:flutter/material.dart';
import 'package:group_select/group_select.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Group Select Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// 定义分组数据
final List<GroupData> groupDataList = [
GroupData(
title: 'Group 1',
items: [
ItemData(value: 'item1_1', text: 'Item 1-1'),
ItemData(value: 'item1_2', text: 'Item 1-2'),
],
),
GroupData(
title: 'Group 2',
items: [
ItemData(value: 'item2_1', text: 'Item 2-1'),
ItemData(value: 'item2_2', text: 'Item 2-2'),
],
),
];
// 保存选中的值
List<String> selectedValues = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Group Select Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
// 使用GroupSelect组件
GroupSelect<String>(
groupDataList: groupDataList,
initialSelectedValues: selectedValues,
onChanged: (newValue) {
setState(() {
selectedValues = newValue;
});
},
itemBuilder: (context, itemData) {
return ListTile(
title: Text(itemData.text),
trailing: Checkbox(
value: selectedValues.contains(itemData.value),
onChanged: (value) {
// 这里不能直接调用onChanged,因为我们需要处理分组逻辑
// 可以考虑使用一个临时列表来收集变化,然后统一更新
// 但为了简单起见,这里直接调用,仅作示例
setState(() {
if (value) {
selectedValues.add(itemData.value);
} else {
selectedValues.remove(itemData.value);
}
});
// 注意:实际使用中,应该通过某种方式通知GroupSelect组件知道这个变化
// 这里为了简化,我们直接调用了父组件的onChanged,这在实际中可能会导致问题
// 正确的做法是使用一个中间变量,在结束时统一调用onChanged
},
),
);
},
),
SizedBox(height: 20),
Text('Selected Values: $selectedValues'),
],
),
),
);
}
}
// GroupData 和 ItemData 类定义,用于存储分组和项的数据
class GroupData {
final String title;
final List<ItemData> items;
GroupData({required this.title, required this.items});
}
class ItemData {
final String value;
final String text;
ItemData({required this.value, required this.text});
}
注意:
- 在实际使用中,
itemBuilder
中的Checkbox
的onChanged
回调不能直接调用父组件的onChanged
,因为这可能会导致状态管理上的问题。正确的做法是使用一个临时变量来收集所有变化,然后在用户完成所有选择后,统一调用父组件的onChanged
。 - 上述代码为了简化示例,直接在
Checkbox
的onChanged
回调中更新了selectedValues
并调用了setState
,这在实际项目中可能会导致不一致的状态。
这个示例展示了如何使用group_select
插件来创建一个分组选择界面,并处理用户的选择。你可以根据自己的需求进一步自定义和扩展这个示例。