Flutter 多选
Multi Select Flutter 是一个用于轻松创建多种多选小部件的包。


功能
- 支持 FormField 的特性,例如验证器。
- 中性默认设计,可以随意更改。
- 选择对话框或底部工作表样式的小部件。
- 轻松地将 `listType` 从 LIST 更改为 CHIP。
- 使您的多选 `searchable` 以处理更长的列表。
安装
将此添加到您的 pubspec.yaml 文件中
dependencies:
multi_select_flutter: ^2.1.0
用法
MultiSelectDialog
可以在 `showDialog()` 的 builder 中使用,并通过您自己的按钮触发。
void _showMultiSelectDialog(BuildContext context) async {
await showDialog(
context: context,
builder: (ctx) {
return MultiSelectDialog(
items: _animals.map((e) => MultiSelectItem(e, e)).toList(),
initialValue: _selectedAnimals,
onConfirm: (values) {...},
);
},
);
}
MultiSelectBottomSheet
可以在 `showModalBottomSheet()` 的 builder 中使用,并通过您自己的按钮触发。
void _showMultiSelect(BuildContext context) async {
await showModalBottomSheet(
isScrollControlled: true, // required for min/max child size
context: context,
builder: (ctx) {
return MultiSelectBottomSheet(
items: _animals.map((e) => MultiSelectItem(e, e)).toList(),
initialValue: _selectedAnimals,
onConfirm: (values) {...},
maxChildSize: 0.8,
);
},
);
}
MultiSelectChipDisplay
此小部件可以与您自己的按钮一起使用,也可以指定为 `MultiSelectDialogField` 等小部件的 `chipDisplay` 参数。
为了有效地使用此小部件,请确保在更改源列表的任何时候都设置状态。
您也可以在 onTap 函数中从源列表中删除项目。
MultiSelectChipDisplay(
items: _selectedAnimals.map((e) => MultiSelectItem(e, e)).toList(),
onTap: (value) {
setState(() {
_selectedAnimals.remove(value);
});
},
),
当使用 `chipDisplay` 参数作为 MultiSelectDialogField 的一部分时,MultiSelectChipDisplay 仍然在字段的 BoxDecoration 外部渲染,如这里所示

如果要封装 MultiSelectChipDisplay,请将 MultiSelectDialogField 包装在 Container 中,然后将装饰应用于该 Container
Container(
decoration: BoxDecoration(...),
child: MultiSelectDialogField(
items: _items,
chipDisplay: MultiSelectChipDisplay(...),
),
),

MultiSelectDialogField / MultiSelectBottomSheetField
这些小部件提供了一个 InkWell 按钮,用于打开对话框或底部工作表。
MultiSelectBottomSheetField(
items: _animals.map((e) => MultiSelectItem(e, e.name)).toList(),
listType: MultiSelectListType.CHIP,
searchable: true,
decoration: BoxDecoration(...),
onConfirm: (values) {
setState(() {
_selectedAnimals = values;
});
},
chipDisplay: MultiSelectChipDisplay(),
),
MultiSelectDialogFormField / MultiSelectBottomSheetFormField
这些小部件是 `MultiSelectDialogField` 和 `MultiSelectBottomSheetField` 的 FormField 版本。您可以使用 `validator` 和 `onSaved` 等 FormField 参数。
它带有一个默认的下边框,可以通过 `decoration` 参数覆盖。
MultiSelectDialogFormField(
items: _animals.map((e) => MultiSelectItem(e, e.name)).toList(),
key: _multiSelectKey,
validator: (value) {
if (value == null || value.isEmpty) {
return "Required";
}
return null;
},
onConfirm: (values) {
setState(() {
_selectedAnimals = values;
});
_multiSelectKey.currentState.validate();
},
),
构造函数
MultiSelectDialog
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
confirmText |
文本 | Text("OK") |
指定确认按钮的文本。 |
cancelText |
文本 | Text("取消") |
指定取消按钮的文本。 |
高度 |
双精度 | 空 |
为对话框设置固定高度。 |
initialValue |
List<dynamic> | 空 |
选定的值列表。重新打开对话框时保留值是必需的。 |
items |
List<MultiSelectItem<V>> | 空 |
选项的源列表。 |
listType |
MultiSelectListType | MultiSelectListType.LIST |
更改 listType。可以是 `MultiSelectListType.LIST` 或 `MultiSelectListType.CHIP`。 |
onSelectionChanged |
Function(List<dynamic>) | 空 |
当项目被选中或取消选中时触发。 |
onConfirm |
Function(List<dynamic>) |
空 |
按下确认按钮时触发。 |
searchable |
布尔值 | 假 |
在对话框中启用搜索功能。 |
title |
字符串 | "选择" |
显示在对话框顶部的标题。 |
searchPlaceholder |
字符串 | "搜索" |
设置搜索字段的占位符文本。 |
selectedColor |
颜色 | 空 |
设置选中复选框或标签项目的颜色。 |
colorator |
Color Function(V) | 空 |
根据其值设置单个项目(标签和复选框)的选中颜色。 |
MultiSelectDialogField
MultiSelectDialogField 具有 MultiSelectDialog 的所有参数,以及这些额外的参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
barrierColor |
颜色 | 空 |
设置对话框外部区域的颜色。 |
buttonText |
文本 | "选择" |
设置按钮上显示的文本。 |
buttonIcon |
Icon | Icons.arrow_downward |
指定按钮图标。 |
chipDisplay |
MultiSelectChipDisplay | 空 |
将 MultiSelectChipDisplay 附加到此字段。 |
装饰 |
BoxDecoration | 空 |
设置构成字段的 Container 的样式。 |
MultiSelectBottomSheet
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
confirmText |
文本 | Text("OK") |
指定确认按钮的文本。 |
cancelText |
文本 | Text("取消") |
指定取消按钮的文本。 |
initialChildSize |
双精度 | 0.3 |
底部工作表的初始高度。 |
initialValue |
List<dynamic> | 空 |
选定的值列表。重新打开对话框时保留值是必需的。 |
items |
List<MultiSelectItem<V>> | 空 |
选项的源列表。 |
listType |
MultiSelectListType | MultiSelectListType.LIST |
更改 listType。可以是 `MultiSelectListType.LIST` 或 `MultiSelectListType.CHIP`。 |
maxChildSize |
双精度 | 0.6 |
设置底部工作表的最大高度阈值。 |
minChildSize |
双精度 | 0.3 |
设置在关闭之前底部工作表的最小高度阈值。 |
onSelectionChanged |
Function(List<dynamic>) | 空 |
当项目被选中或取消选中时触发。 |
onConfirm |
Function(List<dynamic>) |
空 |
按下确认按钮时触发。 |
searchable |
布尔值 | 假 |
在对话框中启用搜索功能。 |
title |
字符串 | "选择" |
显示在对话框顶部的标题。 |
searchPlaceholder |
字符串 | "搜索" |
设置搜索字段的占位符文本。 |
selectedColor |
颜色 | 空 |
设置选中复选框或标签项目的颜色。 |
colorator |
Color Function(V) | 空 |
根据其值设置单个项目(标签和复选框)的选中颜色。 |
MultiSelectBottomSheetField
MultiSelectBottomSheetField 具有 MultiSelectBottomSheet 的所有参数,以及这些额外的参数
| 参数 | 类型 | 默认值 | 用法 |
|---|---|---|---|
barrierColor |
颜色 | 空 |
设置底部工作表外部区域的颜色。 |
buttonIcon |
Icon | Icons.arrow_downward |
指定按钮图标。 |
buttonText |
文本 | "选择" |
设置按钮上显示的文本。 |
chipDisplay |
MultiSelectChipDisplay | 空 |
将 MultiSelectChipDisplay 附加到此字段。 |
装饰 |
BoxDecoration | 空 |
设置构成字段的 Container 的样式。 |
shape |
ShapeBorder | RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(15.0))) |
应用 ShapeBorder 来改变底部工作表的边缘。 |
MultiSelectDialogFormField / MultiSelectBottomSheetFormField
这些小部件具有其非 FormField 对等项的所有参数,以及来自 FormField 类的这些额外参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
autovalidate |
List<MultiSelectItem> | 假 |
如果为 true,则表单字段将在每次更改后立即验证并更新其错误文本。默认为 false。 |
key |
GlobalKey<FormFieldState> | 空 |
可用于调用 `_multiSelectKey.currentState.validate()` 等方法。 |
onSaved |
List<MultiSelectItem> | 空 |
每次提交字段时(通常通过调用表单的 `save` 方法)调用的回调。 |
validator |
FormFieldValidator<List> | 空 |
验证。请参阅 Flutter 的文档。 |
MultiSelectChipDisplay
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
alignment |
Alignment | Alignment.centerLeft |
更改标签的对齐方式。 |
chipColor |
颜色 | primaryColor |
设置标签的颜色。 |
装饰 |
BoxDecoration | 空 |
设置构成标签显示区域的 Container 的样式。 |
items |
List<MultiSelectItem> | 空 |
选定项目的源列表。 |
onTap |
Function(dynamic) | 空 |
点击标签时触发。 |
文本样式 |
TextStyle | 空 |
设置标签上的文本样式。 |
opacity |
双精度 | 空 |
设置标签的透明度。 |
colorator |
Color Function(V) | 空 |
根据其值设置单个项目的标签颜色。 |