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 相关文章推荐
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
Jquery 实现图片轮换
Jan 28 Javascript
jQuery实现弹出窗口中切换登录与注册表单
Jun 05 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
使用vue如何构建一个自动建站项目
Feb 05 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
Feb 09 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
Jun 17 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 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
第六节--访问属性和方法
2006/11/16 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
Numpy之random函数使用学习
2019/01/29 Python
树莓派实现移动拍照
2019/06/22 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python自动化操作实现图例绘制
2020/07/09 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
聚网科技C++面试笔试题
2015/09/01 面试题
英文自荐信
2013/12/15 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
公证委托书标准格式
2014/09/11 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
交通安全月活动总结
2015/05/08 职场文书
创业计划书之家教托管
2019/09/25 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL