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 相关文章推荐
ie 处理 gif动画 的onload 事件的一个 bug
Apr 12 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
Dec 03 Javascript
密码框显示提示文字jquery示例
Aug 29 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
Jan 14 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
Nov 17 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
JS调用打印机功能简单示例
Nov 28 Javascript
vue实现手机号码抽奖上下滚动动画示例
Oct 18 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 Javascript
基于webpack.config.js 参数详解
Mar 20 Javascript
vue router 组件的高级应用实例代码
Apr 08 Javascript
Vue表单之v-model绑定下拉列表功能
May 14 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
js post方式传递提交的实现代码
2010/05/31 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
Python3读取zip文件信息的方法
2015/05/22 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
应聘面试自我评价
2014/01/24 职场文书
校企合作协议书
2014/04/16 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
升学宴答谢词
2015/01/05 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
Python编写nmap扫描工具
2021/07/21 Python