Flutter多选

Pub Version

Multi Select Flutter 是一个用于以多种方式创建多选小部件的包。


对话框

底部工作表

选择芯片

功能

  • 支持FormField功能,如验证器。
  • 中性的默认设计,可以根据您的意愿进行修改。
  • 在对话框、底部工作表或选择芯片样式小部件之间进行选择。
  • 让您的多选功能可搜索,以处理更长的列表。

安装

将此添加到您的 pubspec.yaml 文件中

dependencies:
  multi_select_flutter: ^3.1.8

用法

MultiSelectDialogField / MultiSelectBottomSheetField

这些小部件提供了一个 InkWell 按钮,用于打开对话框或底部工作表,并具备 FormField 功能。您可以使用提供的参数根据您的喜好进行自定义。

要存储选定的值,您可以使用 onConfirm 参数。您也可以使用 onSelectionChanged 来实现。

默认情况下,这些小部件会在字段下方渲染 MultiSelectChipDisplay。这可以通过 chipDisplay 参数覆盖,或者通过使用 chipDisplay: MultiSelectChipDisplay.none() 完全删除。

MultiSelectDialogField(
  items: _animals.map((e) => MultiSelectItem(e, e.name)).toList(),
  listType: MultiSelectListType.CHIP,
  onConfirm: (values) {
    _selectedAnimals = values;
  },
),

MultiSelectDialog / MultiSelectBottomSheet

           

如果您希望创建自己的按钮来打开对话框或底部工作表,您可以这样做,然后调用如下函数:

MultiSelectDialog 可用于 showDialog() 的构建器中。

void _showMultiSelect(BuildContext context) async {
  await showDialog(
    context: context,
    builder: (ctx) {
      return  MultiSelectDialog(
        items: _items,
        initialValue: _selectedAnimals,
        onConfirm: (values) {...},
      );
    },
  );
}

MultiSelectBottomSheet 可用于 showModalBottomSheet() 的构建器中。

void _showMultiSelect(BuildContext context) async {
  await showModalBottomSheet(
    isScrollControlled: true, // required for min/max child size
    context: context,
    builder: (ctx) {
      return  MultiSelectBottomSheet(
        items: _items,
        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);
    });
  },
),

如此处所示,属于 MultiSelectDialogField 的 MultiSelectChipDisplay 仍渲染在 MultiSelectDialogField 的 BoxDecoration 之外。

chipDisplay

如果要封装 MultiSelectChipDisplay,请将 MultiSelectDialogField 包装在 Container 中,然后将装饰应用于该 Container。

Container(
  decoration: BoxDecoration(...),
  child: MultiSelectDialogField(
    items: _items,
    chipDisplay: MultiSelectChipDisplay(...),
  ),
),

chipDisplay

MultiSelectChipField

chipField

此小部件类似于 MultiSelectChipDisplay,不同之处在于这些芯片是选择项目的首要界面。

MultiSelectChipField<Animal>(
  items: _items,
  icon: Icon(Icons.check),
  onTap: (values) {
    _selectedAnimals = values;
  },
),

使用 itemBuilder 创建自定义项

MultiSelectChipField<Animal>(
  items: _items,
  key: _multiSelectKey,
  validator: (values) {...}
  itemBuilder: (item, state) {
    // return your custom widget here
    return InkWell(
      onTap: () {
        _selectedAnimals.contains(item.value)
			      ? _selectedAnimals.remove(item.value)
			      : _selectedAnimals.add(item.value);
	      state.didChange(_selectedAnimals);
	      _multiSelectKey.currentState.validate();
	    },
	    child: Text(item.value.name),
    );
  },
),

itemBuilder 参数接受一个函数,该函数将为提供的每个 items 创建一个小部件。

为了使用验证器和其他 FormField 功能与自定义小部件一起使用,您必须在每次更新选定项目列表时调用 state.didChange(_updatedList)

使用 scrollControl 自动滚动

MultiSelectChipField(
  items: _items,
  scrollControl: (controller) {
    _startAnimation(controller);
  },
)

// waits 5 seconds, scrolls to end slow, then back fast
void _startAnimation(ScrollController controller) {
  // when using more than one animation, use async/await
  Future.delayed(const Duration(milliseconds: 5000), () async {
    await controller.animateTo(
      controller.position.maxScrollExtent,
      duration: Duration(milliseconds: 8000), 
      curve: Curves.linear);
      
    await controller.animateTo(
      controller.position.minScrollExtent,
      duration: Duration(milliseconds: 1250),
      curve: Curves.fastLinearToSlowEaseIn);
  });
}

构造函数

MultiSelectDialog

参数 类型 描述
backgroundColor 颜色 设置对话框的背景颜色。
cancelText 文本 指定取消按钮的文本。
checkColor 颜色 设置复选框中勾选的颜色。
closeSearchIcon Icon Icon(Icons.close)
confirmText 文本 指定确认按钮的文本。
colorator 颜色 Function(V) 根据其值设置单个项目的选定颜色。适用于芯片和复选框。
高度 双精度 为对话框设置固定高度。
initialValue List<V> 选定值的列表。重新打开对话框时需要保留值。
items List<MultiSelectItem<V>> 选项的源列表。
itemsTextStyle TextStyle 指定芯片或列表项文本的样式。
listType MultiSelectListType 更改 listType。可以是 MultiSelectListType.LISTMultiSelectListType.CHIP
onSelectionChanged Function(List<V>) 当项目被选中或取消选中时触发。
onConfirm Function(List) 按下确认按钮时触发。
searchable 布尔值 启用对话框内的搜索功能。
searchHintStyle TextStyle 设置搜索提示文本的样式。
searchIcon Icon 显示搜索字段的图标按钮。
searchHint 字符串 设置搜索字段的占位符文本。
searchTextStyle TextStyle 设置搜索文本的样式。
selectedColor 颜色 设置选定复选框或芯片项目的颜色。
title Widget 显示在对话框顶部的标题。
unselectedColor 颜色 设置未选中时芯片主体或复选框边框的颜色。

MultiSelectDialogField

MultiSelectDialogField 具有 MultiSelectDialog 的所有参数以及这些额外的参数

参数 类型 描述
autovalidateMode AutovalidateMode 启用后,表单字段将在每次更改后立即验证并更新其错误文本。默认为禁用。
barrierColor 颜色 设置对话框外部空间的颜色。
buttonText 文本 设置按钮上显示的文本。
buttonIcon Icon 指定按钮图标。
chipDisplay MultiSelectChipDisplay 覆盖此字段的默认 MultiSelectChipDisplay。
装饰 BoxDecoration 样式化构成字段的 Container。
key GlobalKey<FormFieldState> 访问 FormFieldState 方法。
onSaved List<MultiSelectItem> 每当提交字段时(通常通过调用表单的 save 方法)都会调用的回调。
validator FormFieldValidator<List> 验证。请参阅 Flutter 文档

MultiSelectBottomSheet

参数 类型 描述
cancelText 文本 指定取消按钮的文本。
checkColor 颜色 设置复选框中勾选的颜色。
confirmText 文本 指定确认按钮的文本。
closeSearchIcon Icon 隐藏搜索字段的图标按钮。
colorator Color Function(V) 根据其值设置单个项目的选定颜色。适用于芯片和复选框。
initialChildSize 双精度 底部工作表的初始高度。默认为 0.3。
initialValue List<V> 选定值的列表。重新打开底部工作表时需要保留值。
items List<MultiSelectItem<V>> 选项的源列表。
itemsTextStyle TextStyle 指定芯片或列表项文本的样式。
listType MultiSelectListType MultiSelectListType.LIST
maxChildSize 双精度 设置底部工作表的最小高度阈值。默认为 0.6。
minChildSize 双精度 设置底部工作表关闭前的最小高度阈值。默认为 0.3。
onSelectionChanged Function(List<V>) 当项目被选中或取消选中时触发。
onConfirm Function(List) 按下确认按钮时触发。
searchable 布尔值 切换底部工作表内的搜索功能。
searchHint 字符串 设置搜索字段的占位符文本。
searchHintStyle TextStyle 设置搜索提示文本的样式。
searchIcon Icon 显示搜索字段的图标按钮。
searchTextStyle TextStyle 设置搜索文本的样式。
selectedColor 颜色 设置选定复选框或芯片项目的颜色。
title Widget 显示在底部工作表顶部的标题。
unselectedColor 颜色 设置未选中时芯片主体或复选框边框的颜色。

MultiSelectBottomSheetField

MultiSelectBottomSheetField 具有 MultiSelectBottomSheet 的所有参数以及这些额外的参数

参数 类型 描述
autovalidateMode AutovalidateMode 启用后,表单字段将在每次更改后立即验证并更新其错误文本。默认为禁用。
backgroundColor 颜色 设置底部工作表的背景颜色。
barrierColor 颜色 设置底部工作表外部空间的颜色。
buttonIcon Icon 指定按钮图标。
buttonText 文本 设置按钮上显示的文本。
chipDisplay MultiSelectChipDisplay 覆盖此字段的默认 MultiSelectChipDisplay。
装饰 BoxDecoration 样式化构成字段的 Container。
key GlobalKey<FormFieldState> 可用于调用 _multiSelectKey.currentState.validate() 等方法。
onSaved List<MultiSelectItem> 每当提交字段时(通常通过调用表单的 save 方法)都会调用的回调。
shape ShapeBorder 应用 ShapeBorder 来改变底部工作表的边缘。默认为具有顶部圆角半径 15 的 RoundedRectangleBorder。
validator FormFieldValidator<List> 验证。请参阅 Flutter 文档

MultiSelectChipField

参数 类型 描述
autovalidateMode AutovalidateMode 启用后,表单字段将在每次更改后立即验证并更新其错误文本。默认为禁用。
chipColor 颜色 设置芯片的颜色。
chipShape ShapeBorde 为芯片定义 ShapeBorder。
closeSearchIcon Icon 隐藏搜索字段的图标按钮。
colorator Color Function(V) 根据其值设置单个项目的选定芯片颜色。
装饰 BoxDecoration 样式化构成芯片显示区域的 Container。
headerColor 颜色 设置页眉颜色。
高度 双精度 设置可选中区域的高度。
icon Icon 显示在芯片标签之前的图标。
initialValue List<V> 选定项目(在任何交互之前)的列表。
itemBuilder Function(MultiSelectItem<V>, FormFieldState<List<V>>) 构建一个动态创建的自定义小部件,用于每个项目。
items List<MultiSelectItem<V>> 选项的源列表。
key GlobalKey<FormFieldState> 可用于调用 _multiSelectKey.currentState.validate() 等方法。
onSaved List<MultiSelectItem> 每当提交字段时(通常通过调用表单的 save 方法)都会调用的回调。
onTap Function(V) 点击芯片时触发。
scroll 布尔值 启用水平滚动。
scrollBar HorizontalScrollBar 定义滚动条。
scrollControl Function(ScrollController) 利用 ScrollController 自动滚动列表。
searchable 布尔值 切换搜索功能。
searchHint 字符串 设置搜索字段的占位符文本。
searchHintStyle TextStyle 设置搜索提示文本的样式。
searchIcon Icon 显示搜索字段的图标按钮。
searchTextStyle TextStyle 设置搜索文本的样式。
selectedChipColor 颜色 设置选定芯片项目的颜色。
selectedTextStyle TextStyle 设置选定芯片的 TextStyle。
showHeader 布尔值 确定是否显示页眉。
文本样式 TextStyle 设置芯片文本的样式。
title Widget 显示在页眉中的标题。
validator FormFieldValidator<List> 验证。请参阅 Flutter 文档

MultiSelectChipDisplay

参数 类型 描述
alignment Alignment 更改芯片的对齐方式。默认为 Alignment.centerLeft。
chipColor 颜色 设置芯片的颜色。
colorator Color Function(V) 根据其值设置单个项目的芯片颜色。
装饰 BoxDecoration 样式化构成芯片显示区域的 Container。
高度 双精度 设置固定高度。
icon Icon 显示在芯片标签之前的图标。
items List<MultiSelectItem> 选定项目的源列表。
onTap Function(V) 点击芯片时触发。
scroll 布尔值 启用水平滚动而不是换行。
scrollBar HorizontalScrollBar 启用滚动条。
shape ShapeBorder 为芯片定义 ShapeBorder。
文本样式 TextStyle 设置芯片文本的样式。

贡献

欢迎提交拉取请求。对于重大更改,请先打开一个 issue 来讨论您想进行的更改。# multi_select_flutter

GitHub

查看 Github