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 设置文本框中焦点的位置
Nov 20 Javascript
判断浏览器的javascript版本的代码
Sep 03 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
Jan 11 Javascript
javascript无刷新评论实现方法
May 13 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
Aug 05 Javascript
js实现的简单radio背景颜色选择器代码
Aug 18 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
前端主流框架vue学习笔记第二篇
Jul 26 Javascript
使用javascript做在线算法编程
May 25 Javascript
layUI实现三级导航菜单效果
Jul 26 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 jQuery
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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
php下载文件的代码示例
2012/06/29 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
js兼容的placeholder属性详解
2013/08/18 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
python django事务transaction源码分析详解
2017/03/17 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
快速了解Python开发环境Spyder
2020/06/29 Python
python中取绝对值简单方法总结
2020/07/24 Python
python 基于opencv操作摄像头
2020/12/24 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
个人简历自我评价
2014/02/02 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
先进典型发言材料
2014/12/30 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python