Flutter 超实用简单菜单弹出框 PopupMenuButton功能


Posted in Javascript onAugust 06, 2019

相信在实际开发过程当中,肯定少不了这样的功能:

Flutter 超实用简单菜单弹出框 PopupMenuButton功能

点击 AppBar 右上角的按钮,弹出一个菜单供用户选择。

幸运的是,Flutter 提供给我们了一个 Widget,直接就能实现如上的效果。

PopupMenuButton

还是老规矩,先看官方的说明:

Displays a menu when pressed and calls onSelected [1] when the menu is dismissed because an item was selected. The value passed to  onSelected [2] is the value of the selected menu item.

One of child [3] or  icon [4] may be provided, but not both. If  icon [5] is provided, then  PopupMenuButton [6] behaves like an  IconButton [7] .

If both are null, then a standard overflow icon is created (depending on the platform).

大致意思为:

当按下的时候显示一个菜单,选择了一个项目的时候会回调 onSelected ,传递的值是所选菜单的值。

可以提供 child or  icon ,但是不能同时提供。

如果为空,则提供一个默认的图标,取决于平台。

构造函数

看完了官方说明,再来看构造函数:

const PopupMenuButton({
 Key key,
 @required this.itemBuilder,
 this.initialValue,
 this.onSelected,
 this.onCanceled,
 this.tooltip,
 this.elevation = 8.0,
 this.padding = const EdgeInsets.all(8.0),
 this.child,
 this.icon,
 this.offset = Offset.zero,
 this.enabled = true,
}) : assert(itemBuilder != null),
assert(offset != null),
assert(enabled != null),
assert(!(child != null && icon != null)), // fails if passed both parameters
super(key: key);

这里面每一个参数应该都很好理解,就不做过多的解释了,

唯一必传的参数就是 itemBuilder ,也可以看到后面的断言:

assert(!(child != null && icon != null)) 判断了 child 、icon 是否同时不为空,如果是的话就报错了。

简单 Demo

构造函数理解了,官方也提供了一个 Demo,我们来看一下运行效果:

Flutter 超实用简单菜单弹出框 PopupMenuButton功能

再来看一下代码:

/// 首先定义了一个枚举
enum WhyFarther {
 harder,
 smarter,
 selfStarter,
 tradingCharter,
}
/// ------------------------------------
/// build 方法
Widget build(BuildContext context) {
 return Scaffold(
 appBar: AppBar(
 title: Text('PopupMenuButtonPage'),
 actions: <Widget>[
 PopupMenuButton<WhyFarther>(
 onSelected: (WhyFarther result) {
 setState(() {
 _selection = result;
 });
 },
 icon: Icon(Icons.more_vert),
 itemBuilder: (BuildContext context) => <PopupMenuEntry<WhyFarther>>[
 const PopupMenuItem<WhyFarther>(
 value: WhyFarther.harder,
 child: Text('Working a lot harder'),
 ),
 const PopupMenuItem<WhyFarther>(
 value: WhyFarther.smarter,
 child: Text('Being a lot smarter'),
 ),
 const PopupMenuItem<WhyFarther>(
 value: WhyFarther.selfStarter,
 child: Text('Being a self-starter'),
 ),
 const PopupMenuItem<WhyFarther>(
 value: WhyFarther.tradingCharter,
 child: Text('Placed in charge of trading charter'),
 ),
 ],
 ),
 ],
 ),
 body: Container(),
 );
}

解释一下逻辑:

1. 首先定义了一个枚举

2. 然后在  AppBar  的「actions」里定义了  PopupMenuButton

3. 设置 icon 为  Icon(Icons.more_vert)

4. itemBuilder  需返回一个  List<PopupMenuEntry<T>>

5. 这里传入的值就是  PopupMenuItem<WhyFarther>

6. 然后定义  onSelected  参数接收点击回调

这样整体的逻辑就是定义好了,运行一下:

Flutter 超实用简单菜单弹出框 PopupMenuButton功能

总结

这样就完成了一个超级简单并且实用的菜单弹出框,

其实它的实现逻辑和 DropdownButton 差不多,都是使用了  PopupRoute ,

有对这方面感兴趣的同学,可以查看我以前写的文章: Flutter 源码系列:DropdownButton 源码浅析

完整代码已经传至GitHub:https://github.com/wanglu1209/WFlutterDemo

References

[1] onSelected: https://api.flutter.dev/flutter/material/PopupMenuButton/onSelected.html
[2] onSelected: https://api.flutter.dev/flutter/material/PopupMenuButton/onSelected.html
[3] child: https://api.flutter.dev/flutter/material/PopupMenuButton/child.html
[4] icon: https://api.flutter.dev/flutter/material/PopupMenuButton/icon.html
[5] icon: https://api.flutter.dev/flutter/material/PopupMenuButton/icon.html
[6] PopupMenuButton: https://api.flutter.dev/flutter/material/PopupMenuButton-class.html
[7] IconButton: https://api.flutter.dev/flutter/material/IconButton-class.html

总结

以上所述是小编给大家介绍的Flutter 超实用简单菜单弹出框 PopupMenuButton功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
javascript 实现键盘上下左右功能的小例子
Sep 15 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
Sep 03 Javascript
Node.js开源应用框架HapiJS介绍
Jan 14 Javascript
js实现发送验证码后的倒计时功能
May 28 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
Apr 01 Javascript
JS访问DOM节点方法详解
Nov 29 Javascript
webpack 2.x配置reactjs基本开发环境详解
Aug 08 Javascript
微信小程序模板和模块化用法实例分析
Nov 28 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
Apr 27 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 #Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 #Javascript
浅入深出Vue之自动化路由
Aug 06 #Javascript
解决vue单页面修改样式无法覆盖问题
Aug 05 #Javascript
微信小程序3种位置API的使用方法详解
Aug 05 #Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 #Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 #Javascript
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
浅谈php自定义错误日志
2015/02/13 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
玩转方法:call和apply
2014/05/08 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
图解Python变量与赋值
2018/04/03 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
网络教育毕业生自我鉴定
2013/10/10 职场文书
大学生优秀团员事迹材料
2014/01/30 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
《风筝》教学反思
2014/04/10 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript