下拉按钮

Dart SDK Version Pub Version style: very good analysis License: MIT

pull_down_button 是对 Flutter 的 PopupMenuButton 的重构,使其样式类似于 iOS 14+ 的 弹出和下拉 按钮,并提供了一些额外的自定义选项。


Flutter 可用性

由于该包使用了 Flutter 的新特性 ThemeExtension 进行主题设置,因此最低支持版本为稳定版 3.0.0 或 Beta 版 2.13.0-0


PullDownButton

PullDownButton example

PullDownButton 是一个用于显示下拉菜单的小部件。与 PopupMenuButton 不同,PullDownButton 允许通过 buttonBuilder 构建函数对用于显示下拉菜单的按钮进行更好的自定义。

当下拉菜单打开时,调用该菜单的按钮将具有较低的透明度。

PullDownButton(
  itemBuilder: (context) => [
    PullDownMenuItem(
      title: 'Menu item',
      onTap: () => action(),
    ),
    const PullDownMenuDivider(),
    PullDownMenuItem(
      title: 'Menu item 2',
      onTap: () => action2(),
    ),
  ],
  position: PullDownMenuPosition.under,
  buttonBuilder: (context, showMenu) => CupertinoButton(
    onPressed: showMenu,
    padding: EdgeInsets.zero,
    child: const Icon(CupertinoIcons.ellipsis_circle),
  ),
);
参数 描述 Value
itemBuilder 当按钮被按下时调用,以创建菜单中要显示的项。 必需
buttonBuilder 构建器,提供 BuildContext 以及 showMenu 函数,可以将其传递给任何自定义按钮小部件。 必需
onCanceled 当用户关闭下拉菜单时调用。 可选
offset 该偏移量是相对于 position 设置的初始位置应用的。 Offset.zero
position 弹出菜单是位于弹出菜单按钮的上方还是下方。 PullDownMenuPosition.above
backgroundColor 下拉菜单的背景颜色。 可选

backgroundColor 通常具有 0.7-0.8 范围内的不透明度,以便菜单具有模糊效果。

PullDownMenuPosition

PullDownButton 定位其下拉菜单的方式。

可用选项

  • over
  • under
  • above

PullDownMenuItem

PullDownMenuItem example

PullDownMenuItem 是一个用于创建 Cupertino 风格下拉菜单项的小部件。

PullDownMenuItem(
  title: 'Add to favourites',
  onTap: () => action(),
  icon: CupertinoIcons.star,
),
参数 描述 Value
onTap 当菜单项被点击时调用。 必需
enabled 用户是否可以点击此项。
title PullDownMenuItem 的标题。 必需
icon PullDownMenuItem 的尾部图标。 可选
isDestructive 此项是否表示破坏性操作。
iconSize 尾部图标的大小。 可选
文本样式 标题文本样式。 可选
destructiveColor 破坏性操作的颜色。 可选

SelectablePullDownMenuItem

SelectablePullDownMenuItem example

SelectablePullDownMenuItem 是一个用于创建具有选中状态的 Cupertino 风格下拉菜单项的小部件。

SelectablePullDownMenuItem(
  title: 'Order by size',
  selected: true,
  onTap: () => action(),
  icon: CupertinoIcons.chevron_down,
),
笔记

根据 指南,如果菜单项包含至少一个可点击的 SelectablePullDownMenuItem 项,则所有 PullDownMenuItem 项也应为 SelectablePullDownMenuItem 类型(以插入额外的填充,使所有项具有相同的填充)。尽管如此,手动更改所有 PullDownMenuItem 项并非必需,它会自动完成。

SelectablePullDownMenuItem conversion example

SelectablePullDownMenuItem 使用了 PullDownMenuItem 的所有参数以及一些 SelectablePullDownMenuItem 特有的参数。

参数 描述 Value
selected 是否在菜单项旁边显示复选标记。
checkmark 复选标记图标。 可选
checkmarkWeight 复选标记图标的粗细。 可选
checkmarkSize 复选标记图标的大小。 可选

PullDownMenuDivider

PullDownMenuDivider example

PullDownMenuDivider 是一个用于创建 Cupertino 风格下拉菜单分隔线(细或粗)的小部件。

const PullDownMenuDivider(),

或用于创建粗分隔线。

const PullDownMenuDivider.large(),

还有一个方便的方法可以包装多个带有细分隔线的菜单项。

...PullDownMenuDivider.wrapWithDivider([
  PullDownMenuItem(
    title: 'Menu item',
    onTap: () => action(),
  ),
  PullDownMenuItem(
    title: 'Menu item 2',
    onTap: () => action2(),
  ),
]),
参数 描述 Value
dividerColor 细分隔线的颜色。 可选
largeDividerColor 粗分隔线的颜色。 可选

largeDividerColor 通常比 dividerColor 更浅。


PullDownMenuTitle

PullDownMenuTitle example

PullDownMenuTitle 是一个用于创建 Cupertino 风格下拉菜单标题(通常在菜单顶部)的小部件。

const PullDownMenuTitle(title: Text('Pull-down menu')),
参数 描述 Value
title 标题小部件。 必需
titleStyle 标题小部件的样式。 可选

主题化

此包还提供了额外的自定义选项。默认情况下,使用 iOS15 主题,但也可以通过小部件参数(参见上文)或 PullDownButtonTheme 主题扩展来覆盖默认设置。

默认主题

浅色主题 深色主题
light default theme example dark default theme example

PullDownButtonTheme

用法

要使用 PullDownButtonTheme,请像这样在您的 ThemeData 中定义它,如果定义了,PullDownButton 将会自动使用。

ThemeData(
  ...,
  extensions: [
    PullDownButtonTheme(
      backgroundColor: Colors.grey,
      iconSize: 24,
      dividerColor: Colors.black,
    ),
  ],
),
参数 描述 Value
backgroundColor 下拉菜单的背景颜色。 可选
dividerColor 细分隔线的颜色。 可选
largeDividerColor 粗分隔线的颜色。 可选
destructiveColor 破坏性操作的颜色。 可选
iconSize 尾部图标的大小。 可选
checkmark 复选标记图标。 可选
checkmarkWeight 复选标记图标的粗细。 可选
checkmarkSize 复选标记图标的大小。 可选
文本样式 标题文本样式。 可选
titleStyle 标题小部件的样式。 可选

backgroundColor 通常具有 0.7-0.8 范围内的不透明度,以便菜单具有模糊效果。largeDividerColor 通常比 dividerColor 更浅。

以下是使用 PullDownButtonTheme 结合 Material 3 颜色方案颜色和来自 Material 3 菜单规范 的文本样式的示例。

自定义 Material 3 浅色主题 自定义 Material 3 深色主题
light theme example dark theme example

贡献

欢迎您为本项目做出贡献。

请在 issue tracker 提交功能请求和错误报告。

如果您自己修复了错误或实现了功能,请随时发送 pull request

GitHub

查看 Github