下拉按钮
pull_down_button 是对 Flutter 的 PopupMenuButton 的重构,使其样式类似于 iOS 14+ 的 弹出和下拉 按钮,并提供了一些额外的自定义选项。
Flutter 可用性
由于该包使用了 Flutter 的新特性 ThemeExtension 进行主题设置,因此最低支持版本为稳定版 3.0.0 或 Beta 版 2.13.0-0。
PullDownButton
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 是一个用于创建 Cupertino 风格下拉菜单项的小部件。
PullDownMenuItem(
title: 'Add to favourites',
onTap: () => action(),
icon: CupertinoIcons.star,
),
| 参数 | 描述 | Value |
|---|---|---|
| onTap | 当菜单项被点击时调用。 | 必需 |
| enabled | 用户是否可以点击此项。 | 真 |
| title | 此 PullDownMenuItem 的标题。 |
必需 |
| icon | 此 PullDownMenuItem 的尾部图标。 |
可选 |
| isDestructive | 此项是否表示破坏性操作。 | 假 |
| iconSize | 尾部图标的大小。 | 可选 |
| 文本样式 | 标题文本样式。 | 可选 |
| destructiveColor | 破坏性操作的颜色。 | 可选 |
SelectablePullDownMenuItem
SelectablePullDownMenuItem 是一个用于创建具有选中状态的 Cupertino 风格下拉菜单项的小部件。
SelectablePullDownMenuItem(
title: 'Order by size',
selected: true,
onTap: () => action(),
icon: CupertinoIcons.chevron_down,
),
笔记
根据 指南,如果菜单项包含至少一个可点击的 SelectablePullDownMenuItem 项,则所有 PullDownMenuItem 项也应为 SelectablePullDownMenuItem 类型(以插入额外的填充,使所有项具有相同的填充)。尽管如此,手动更改所有 PullDownMenuItem 项并非必需,它会自动完成。
SelectablePullDownMenuItem 使用了 PullDownMenuItem 的所有参数以及一些 SelectablePullDownMenuItem 特有的参数。
| 参数 | 描述 | Value |
|---|---|---|
| selected | 是否在菜单项旁边显示复选标记。 | 假 |
| checkmark | 复选标记图标。 | 可选 |
| checkmarkWeight | 复选标记图标的粗细。 | 可选 |
| checkmarkSize | 复选标记图标的大小。 | 可选 |
PullDownMenuDivider
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 是一个用于创建 Cupertino 风格下拉菜单标题(通常在菜单顶部)的小部件。
const PullDownMenuTitle(title: Text('Pull-down menu')),
| 参数 | 描述 | Value |
|---|---|---|
| title | 标题小部件。 | 必需 |
| titleStyle | 标题小部件的样式。 | 可选 |
主题化
此包还提供了额外的自定义选项。默认情况下,使用 iOS15 主题,但也可以通过小部件参数(参见上文)或 PullDownButtonTheme 主题扩展来覆盖默认设置。
默认主题
| 浅色主题 | 深色主题 |
|---|---|
![]() |
![]() |
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 深色主题 |
|---|---|
![]() |
![]() |
贡献
欢迎您为本项目做出贡献。
请在 issue tracker 提交功能请求和错误报告。
如果您自己修复了错误或实现了功能,请随时发送 pull request。







