PopupMenuButton 是一个按钮,当你点击按钮的时候,就会弹出类似 Android 选项菜单的框。

PopupMenuButton 的快速上手

PopupMenuButton 是点击后会弹出菜单选项的按钮,其 child 参数是用来显示按钮的内容,itemBuilder 参数是用来显示弹出的菜单,onSelected 参数用于处理菜单点击事件:

  1. PopupMenuButton<MenuItem>(
  2. child: Text('更多'),
  3. onSelected: (MenuItem result) {
  4. print('click '+result.toString());
  5. },
  6. itemBuilder: (BuildContext context) => <PopupMenuEntry<MenuItem>>[
  7. const PopupMenuItem<MenuItem>(
  8. value: MenuItem.menuA,
  9. child: Text('menu A'),
  10. ),
  11. const PopupMenuItem<MenuItem>(
  12. value: MenuItem.menuB,
  13. child: Text('menu B'),
  14. ),
  15. const PopupMenuItem<MenuItem>(
  16. value: MenuItem.menuC,
  17. child: Text('menu C'),
  18. ),
  19. const PopupMenuItem<MenuItem>(
  20. value: MenuItem.menuD,
  21. child: Text('menu D'),
  22. ),
  23. ],
  24. )

PopupMenuButton 在一个页面使用的完整 Demo 如下:

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(PopupMenuButtonWidget());
  3. class PopupMenuButtonWidget extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. title: "Flutter Demo",
  8. theme: ThemeData(
  9. primaryColor: Colors.blue,
  10. ),
  11. home: Scaffold(
  12. appBar: AppBar(title: Text("Flutter UI基础Widget -- 按钮")),
  13. body: PopupMenuButton<MenuItem>(
  14. child: Text('更多'),
  15. onSelected: (MenuItem result) {
  16. print('click '+result.toString());
  17. },
  18. itemBuilder: (BuildContext context) => <PopupMenuEntry<MenuItem>>[
  19. const PopupMenuItem<MenuItem>(
  20. value: MenuItem.menuA,
  21. child: Text('menu A'),
  22. ),
  23. const PopupMenuItem<MenuItem>(
  24. value: MenuItem.menuB,
  25. child: Text('menu B'),
  26. ),
  27. const PopupMenuItem<MenuItem>(
  28. value: MenuItem.menuC,
  29. child: Text('menu C'),
  30. ),
  31. const PopupMenuItem<MenuItem>(
  32. value: MenuItem.menuD,
  33. child: Text('menu D'),
  34. ),
  35. ],
  36. )),
  37. );
  38. }
  39. }
  40. enum MenuItem { menuA, menuB, menuC, menuD }

运行后有一个更多的按钮,点击这个按钮,会展开菜单:

菜单选择

如何知道选中了哪个菜单呢?
在 onSelected 里会返回选中的菜单:

  1. onSelected: (MenuItem result) {
  2. print('click '+result.toString());
  3. },

PopupMenuButton 的构造函数及参数说明

PopupMenuButton 的构造函数为:

  1. class PopupMenuButton<T> extends StatefulWidget {
  2. const PopupMenuButton({
  3. Key key,
  4. @required this.itemBuilder,
  5. this.initialValue,
  6. this.onSelected,
  7. this.onCanceled,
  8. this.tooltip,
  9. this.elevation = 8.0,
  10. this.padding = const EdgeInsets.all(8.0),
  11. this.child,
  12. this.icon,
  13. this.offset = Offset.zero,
  14. }) : assert(itemBuilder != null),
  15. assert(offset != null),
  16. assert(!(child != null && icon != null)), // fails if passed both parameters
  17. super(key: key);
  18. ...
  19. }
参数名字 参数类型 意义 必选 or 可选
key Key Widget 的标识 可选
itemBuilder PopupMenuItemBuilder 要显示的菜单 必选
initialValue T 初始化的菜单项
如果有,在菜单打开时会突出显示。
可选
onSelected PopupMenuItemSelected 当用户从此按钮创建的弹出菜单中选择一个值时调用。 可选
onCanceled PopupMenuItemSelected 当用户在不选择项目的情况下关闭弹出菜单时调用。 可选
tooltip String 当长按时显示的文本,用于盲人辅助模式下 可选
elevation double Button 相对于其父级放置的z坐标,这可以控制 menu 下的阴影大小
默认值为8.0,该值必须>=0
可选
padding EdgeInsetsGeometry menu 的内边距 可选
child Widget 这个按钮里显示的内容 可选
icon Icon 这个按钮里显示的 Icon Widget,前面在 图片框和Icon 一节讲过如何使用 Icon Widget 可选
offset Offset menu 相对按钮的偏移量 可选

参考

【1】Flutter 实战
【2】Flutter 中文文档
【3】Flutter 完全手册