Flutter多项选择插件flutter_multi_select_items的使用
Flutter多项选择插件flutter_multi_select_items的使用
简介
flutter_multi_select_items
是一个用于创建多选组件的简单Flutter包。它易于处理且高度可定制,能够满足不同场景下的多选需求。
所有示例代码可以在这个Flutter项目中找到。
注意 - 如果遇到编译错误,请确保升级到最新版本的Flutter或尝试使用较低版本的flutter_multi_select_items
。
多选容器参数
参数 | 描述 |
---|---|
items | MultiSelectCard 列表,用于多选容器。 |
maxSelectableCount | 最大可选数量。 |
itemsPadding | MultiSelectCard 项的内边距。 |
isMaxSelectableWithPerpetualSelects | 如果为true,则最大选择数量 = 最大选择数量 + 永久选择项。 |
itemsDecoration | 所有项的公共装饰。 |
textStyles | 所有项的公共文本样式。 |
animations | 用于多选项卡片内部的行对齐设置。 |
alignments | 动画设置,如动画持续时间和曲线。 |
prefix | 每个多选项前的公共可选小部件。 |
suffix | 每个多选项后的公共可选小部件。 |
wrapSettings | 默认所有项都在Wrap 中,所以这些是Wrap 的设置。 |
listViewSettings | 如果showInListView 为true,则为列表视图设置。 |
showInListView | 如果为true,显示所有多选项目在一个列表视图中。 |
controller | 多选控制器,允许获取所有已选项、取消选择所有项、选择所有项。 |
onChange | 当项目被选择时调用。 |
onMaximumSelected | 当达到最大可选数量时调用。 |
MultiSelectCard参数
参数 | 描述 |
---|---|
value | 多选项的值,可以是字符串、整数或任何类型。这也是onChange 返回的值或值列表。 |
decorations | 每个项的独特装饰,如果需要为每个项添加不同的装饰则使用此参数。否则,可以使用MultiSelectContainer 中的MultiSelectDecorations 。 |
textStyles | 每个多选卡的独特文本样式,如果需要为每个复选列表添加不同的文本样式则使用此参数。 |
label | 多选项的标签。 |
child | 多选项的子元素,可以使用任何小部件作为子元素。 |
clipBehavior | 项的裁剪行为。 |
prefix | 每个项前的唯一可选小部件。 |
suffix | 每个项后的唯一可选小部件。 |
selected | 如果为true,则永久处于选中位置。 |
perpetualSelected | 如果为true,则永久处于选中位置。 |
splashColor | 项的点击颜色。 |
highlightColor | 项的高亮颜色。 |
labelGap | 标签与[prefix]或[suffix]之间的间距。 |
最小配置示例
import 'package:flutter/material.dart';
import 'package:flutter_multi_select_items/flutter_multi_select_items.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter Multi Select Example')),
body: MultiSelectContainer(
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java'),
MultiSelectCard(value: 'C#', label: 'C#'),
MultiSelectCard(value: 'C++', label: 'C++'),
MultiSelectCard(value: 'Go Lang', label: 'Go Lang'),
MultiSelectCard(value: 'Swift', label: 'Swift'),
MultiSelectCard(value: 'PHP', label: 'PHP'),
MultiSelectCard(value: 'Kotlin', label: 'Kotlin')
],
onChange: (allSelectedItems, selectedItem) {
print('Selected Items: $allSelectedItems');
},
),
),
);
}
}
限制选择数量
MultiSelectContainer(
maxSelectableCount: 5,
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java'),
MultiSelectCard(value: 'C#', label: 'C#'),
MultiSelectCard(value: 'C++', label: 'C++'),
MultiSelectCard(value: 'Go Lang', label: 'Go Lang'),
MultiSelectCard(value: 'Swift', label: 'Swift'),
MultiSelectCard(value: 'PHP', label: 'PHP'),
MultiSelectCard(value: 'Kotlin', label: 'Kotlin')
],
onMaximumSelected: (allSelectedItems, selectedItem) {
CustomSnackBar.showInSnackBar('The limit has been reached', context);
},
onChange: (allSelectedItems, selectedItem) {},
)
图标前缀和后缀
前缀
MultiSelectContainer(
prefix: MultiSelectPrefix(
selectedPrefix: const Padding(
padding: EdgeInsets.only(right: 5),
child: Icon(
Icons.check,
color: Colors.white,
size: 14,
),
),
disabledPrefix: const Padding(
padding: EdgeInsets.only(right: 5),
child: Icon(
Icons.do_disturb_alt_sharp,
size: 14,
),
),
),
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java', enabled: false),
MultiSelectCard(value: 'C#', label: 'C#'),
],
onChange: (allSelectedItems, selectedItem) {},
)
后缀
MultiSelectContainer(
suffix: MultiSelectSuffix(
selectedSuffix: const Padding(
padding: EdgeInsets.only(left: 5),
child: Icon(
Icons.check,
color: Colors.white,
size: 14,
),
),
disabledSuffix: const Padding(
padding: EdgeInsets.only(left: 5),
child: Icon(
Icons.do_disturb_alt_sharp,
size: 14,
),
),
),
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java', enabled: false),
MultiSelectCard(value: 'C#', label: 'C#'),
],
onChange: (allSelectedItems, selectedItem) {},
)
装饰
公共装饰
MultiSelectContainer(
itemsDecoration: MultiSelectDecorations(
decoration: BoxDecoration(
gradient: LinearGradient(colors: [
Colors.green.withOpacity(0.1),
Colors.yellow.withOpacity(0.1),
]),
border: Border.all(color: Colors.green[200]!),
borderRadius: BorderRadius.circular(20),
),
selectedDecoration: BoxDecoration(
gradient: const LinearGradient(colors: [
Colors.green,
Colors.lightGreen,
]),
border: Border.all(color: Colors.green[700]!),
borderRadius: BorderRadius.circular(5),
),
disabledDecoration: BoxDecoration(
color: Colors.grey,
border: Border.all(color: Colors.grey[500]!),
borderRadius: BorderRadius.circular(10),
),
),
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java'),
MultiSelectCard(value: 'C#', label: 'C#'),
MultiSelectCard(value: 'C++', label: 'C++'),
],
onChange: (allSelectedItems, selectedItem) {},
)
每项独特装饰
MultiSelectContainer(
items: [
MultiSelectCard(
value: 'Dart',
label: 'Dart',
decorations: MultiSelectItemDecorations(
decoration: BoxDecoration(
color: Colors.purple.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
),
selectedDecoration: BoxDecoration(
color: Colors.purple,
borderRadius: BorderRadius.circular(5),
),
),
),
MultiSelectCard(
value: 'Python',
label: 'Python',
decorations: MultiSelectItemDecorations(
decoration: BoxDecoration(
color: Colors.lightBlue.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
),
selectedDecoration: BoxDecoration(
color: Colors.lightBlue,
borderRadius: BorderRadius.circular(5),
),
),
),
// ...其他项...
],
onChange: (allSelectedItems, selectedItem) {},
)
文本样式
公共文本样式
MultiSelectContainer(
textStyles: const MultiSelectTextStyles(
textStyle: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.lightBlue,
),
),
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java'),
MultiSelectCard(value: 'Go Lang', label: 'Go Lang'),
MultiSelectCard(value: 'Swift', label: 'Swift'),
MultiSelectCard(value: 'Kotlin', label: 'Kotlin'),
],
onChange: (allSelectedItems, selectedItem) {},
)
每项独特文本样式
MultiSelectContainer(
items: [
MultiSelectCard(
value: 'Dart',
label: 'Dart',
textStyles: const MultiSelectItemTextStyles(
textStyle: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.purple,
),
),
),
MultiSelectCard(
value: 'Python',
label: 'Python',
textStyles: const MultiSelectItemTextStyles(
textStyle: TextStyle(color: Colors.lightBlue),
),
),
// ...其他项...
],
onChange: (allSelectedItems, selectedItem) {},
)
水平芯片列表
SizedBox(
height: 60,
child: MultiSelectContainer(
showInListView: true,
listViewSettings: ListViewSettings(
scrollDirection: Axis.horizontal,
separatorBuilder: (_, __) => const SizedBox(width: 10),
),
items: [
MultiSelectCard(value: 'Dart', label: 'Dart'),
MultiSelectCard(value: 'Python', label: 'Python'),
MultiSelectCard(value: 'JavaScript', label: 'JavaScript'),
MultiSelectCard(value: 'Java', label: 'Java'),
MultiSelectCard(value: 'C#', label: 'C#'),
MultiSelectCard(value: 'C++', label: 'C++'),
MultiSelectCard(value: 'Go Lang', label: 'Go Lang'),
MultiSelectCard(value: 'Swift', label: 'Swift'),
MultiSelectCard(value: 'PHP', label: 'PHP'),
MultiSelectCard(value: 'Kotlin', label: 'Kotlin'),
],
onChange: (allSelectedItems, selectedItem) {},
),
)
控制器
final MultiSelectController<String> _controller = MultiSelectController(
deSelectPerpetualSelectedItems: true,
);
// 使用控制器
MultiSelectContainer(
controller: _controller,
// ...其他配置...
)
// 方法
_controller.selectAll();
_controller.deselectAll();
_controller.getSelectedItems();
任意小部件
Widget getChild(String imagePath, String title) {
return SizedBox(
width: 75,
height: 50,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: Image.network(
imagePath,
fit: BoxFit.contain,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(title),
)
],
),
);
}
return MultiSelectContainer(
itemsPadding: const EdgeInsets.all(5),
itemsDecoration: MultiSelectDecorations(
decoration: BoxDecoration(
color: Colors.indigo.withOpacity(0.1),
),
selectedDecoration: const BoxDecoration(
gradient: LinearGradient(colors: [
Colors.green,
Colors.lightGreen,
]),
),
),
items: [
MultiSelectCard(
value: 'Dart',
child: getChild(
'https://host/Dart-logo.png',
'Dart',
),
),
// ...其他项...
],
onChange: (allSelectedItems, selectedItem) {},
);
多选检查列表视图
MultiSelectCheckList(
maxSelectableCount: 5,
textStyles: const MultiSelectTextStyles(
selectedTextStyle: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
itemsDecoration: MultiSelectDecorations(
selectedDecoration: BoxDecoration(color: Colors.indigo.withOpacity(0.8)),
),
listViewSettings: ListViewSettings(
separatorBuilder: (context, index) => const Divider(height: 0),
),
controller: _controller,
items: List.generate(
_items.length,
(index) => CheckListCard(
value: _items[index].id,
title: Text(_items[index].title),
subtitle: Text(_items[index].subTitle),
selectedColor: Colors.white,
checkColor: Colors.indigo,
selected: index == 3,
enabled: !(index == 5),
checkBoxBorderSide: const BorderSide(color: Colors.blue),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),
),
),
onChange: (allSelectedItems, selectedItem) {},
onMaximumSelected: (allSelectedItems, selectedItem) {
CustomSnackBar.showInSnackBar('The limit has been reached', context);
},
)
以上是flutter_multi_select_items
插件的详细使用说明及示例代码。希望对你有所帮助!
更多关于Flutter多项选择插件flutter_multi_select_items的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复