Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter | 超实用简单菜单弹出框 PopupMenuButton

Flutter | 超实用简单菜单弹出框 PopupMenuButton

作者头像
Flutter笔记
发布于 2019-08-09 11:42:59
发布于 2019-08-09 11:42:59
5.9K01
代码可运行
举报
文章被收录于专栏:Flutter笔记Flutter笔记
运行总次数:1
代码可运行

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

点击 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 ,但是不能同时提供。 如果为空,则提供一个默认的图标,取决于平台。

构造函数

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 parameterssuper(key: key);

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

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

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

简单 Demo

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

再来看一下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 首先定义了一个枚举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」里定义了 PopupMenuButton3.设置 icon 为 Icon(Icons.more_vert)4.itemBuilder 需返回一个 List<PopupMenuEntry<T>>5.这里传入的值就是 PopupMenuItem<WhyFarther>6.然后定义 onSelected 参数接收点击回调

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

总结

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Flutter笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter 知识集锦 | Dart 枚举已支持属性成员
在 Flutter3.0 之后,Dart 版本到 2.17 。虽然知道 Dart 枚举已支持属性成员,但一直没有用过。最近刚好有个使用的小场景,就来介绍一下。将以如下的 PopupMenuButton 的按钮数据来介绍:
张风捷特烈
2024/02/07
1K0
Flutter 知识集锦 | Dart 枚举已支持属性成员
flutter组件6【AppBar的使用】
1.图示 2.解释 AppBar 有以下常用属性: leading → Widget - 在标题前面显示的一个控件,在首页通常显示应用的 logo;在其他界面通常显示为返回按钮。 title → Wi
sinnoo
2020/11/13
1.2K0
flutter组件6【AppBar的使用】
【Flutter 专题】23 图解PopupMenu 那些事儿~
和尚需要处理标题栏弹出对话框 PopupMenu 样式,Flutter 当然提供了一些处理方式,类似 PopupMenuEntry 等,和尚仅就最基础的使用方式进行初步的学习和整理。
阿策小和尚
2019/08/12
2.1K0
【Flutter 专题】23 图解PopupMenu 那些事儿~
【Flutter 实战】菜单(Menu)功能
默认情况下,PopupMenuButton显示3个小圆点,我们也可以对齐进行设置,设置文字如下:
老孟Flutter
2020/09/22
2.5K0
【Flutter 实战】菜单(Menu)功能
Flutter基础widgets教程-PopupMenuButton篇
1 PopupMenuButton 当菜单隐藏式,点击或调用onSelected时显示一个弹出式菜单列表 2 构造函数 PopupMenuButton({ Key key, @required this.itemBuilder, this.initialValue, this.onSelected, this.onCanceled, this.tooltip, this.elevation = 8.0, this.padding = const
青年码农
2020/10/10
7320
Flutter基础widgets教程-PopupMenuButton篇
Flutter AppBar入门使用
实现效果图 [1240] 主要代码 class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: new Icon(Icons.arrow_back_ios), title: new Text(widget.title),
易寒
2022/01/15
5680
『Flutter』常用组件 按钮、图片
经过『Flutter』布局组件 Container、Row、Column、Stack上一篇文章的学习,我们大家可以了解到布局相关的组件,但是在实际开发中,我们还需要使用到其他的组件,比如按钮、图片、文本、输入框等等,这些组件都是我们在开发中经常使用的,所以本篇文章我们就来学习一下这些常用组件。
程序员NEO
2025/03/07
2240
『Flutter』常用组件 按钮、图片
flutter系列之:flutter中可以建索引的栈布局IndexedStack
之前我们介绍了一个flutter的栈结构的layout组件叫做Stack,通过Stack我们可以将一些widget叠放在其他widget之上,从而可以实现图像的组合功能,也是日常中最常用的一种组件了。今天我们要介绍的组件是Stack的近亲,叫做IndexedStack,它有什么功能呢?一起来看看吧。
程序那些事
2022/10/21
3510
你知道吗,Flutter内置了10多种Button控件
Flutter内置了10多种Button(按钮)类控件供我们使用,了解这些控件有助于提高我们的开发速度。
老孟Flutter
2020/09/11
3.1K0
『Flutter』常用组件 按钮、图片
经过上一篇文章的学习,我们大家可以了解到布局相关的组件,但是在实际开发中,我们还需要使用到其他的组件,比如按钮、图片、文本、输入框等等,这些组件都是我们在开发中经常使用的,所以本篇文章我们就来学习一下这些常用组件。
杨不易呀
2024/01/16
6782
『Flutter』常用组件 按钮、图片
你知道吗,Flutter内置了10多种show
builder通常返回Dialog组件,比如SimpleDialog和AlertDialog。
老孟Flutter
2020/03/19
2K0
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )
Flutter 中的 Scaffold 组件实现了基础的材料设计 ( Material Design ) 可视化布局结构 ;
韩曙亮
2023/03/29
3K0
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )
flutter3_window_chat仿微信桌面端聊天实战
年前有给大家分享一款flutter3.x+dart3手机端聊天App实例。春节期间就又捣鼓了flutter3桌面端开发实践项目。
andy2018
2024/03/03
7740
Flutter之旅:认识Widget(源码级)
1.Widget的第一印象 1.1:初次的见面 首先我们来到第一次看到Widget类的场景,那时还对这个世界一无所知, 进入程序的入口时runApp函数中需要传入一个Widget对象,这便是第一眼。 初始项目中的做法是自定义了一个MyApp类继承自StatelessWidget。 void main()=>runApp(MyApp()); ---->[flutter/lib/src/widgets/binding.dart:778]---- void runApp(Widget app) {
张风捷特烈
2020/04/30
1.4K0
Flutter之旅:认识Widget(源码级)
Flutter简单介绍以及 Hello World解析
flutter:学习官网:https://api.flutter.dev/flutter/material/RaisedButton-class.html
zhangjiqun
2024/12/16
1480
Flutter实现代码提示功能
在实现代码提示功能前,我们先来看看什么是代码提示,当我输入关键字String 时,如果输入到 Stri 的时候,编辑器会为我找出所有包含 Stri 的代码关键词,这个时候,我们只要选中需要输入的关键字,它就会为我补充剩余的单词,这个就是代码提示功能,那么在Flutter 中如何实现这一功能呢?
rhyme_lph
2021/07/29
1.7K0
Flutter实现代码提示功能
用flutter给图片加个好看的遮罩层【flutter20个实例之六】
左起图一是我业务中的样式,左起图二、三是下方源码展示样式(复制可直接运行,无额外组件引入)
sinnoo
2020/11/13
4.3K0
用flutter给图片加个好看的遮罩层【flutter20个实例之六】
Flutter 入门指北之快速搭建界面(含Flutter知识体系)
完整版脑图,后台回复 “Flutter” 关键字,关注 码个蛋(codeegg)会持续更新本系列文章.
陈宇明
2020/12/16
1.8K0
Flutter 滑动删除最佳实践
现在我们只需要理解,key 是 widget 的唯一标示。因为有了key,所以 widget tree 才知道我们删除了什么widget。
Flutter笔记
2019/07/24
2.2K0
Flutter 滑动删除最佳实践
Flutter TolyUI 框架#04 | 侧栏菜单设计
TolyUI 是 张风捷特烈 打造的 Fluter 全平台应用开发 UI 框架。具备 全平台、组件化、源码开放、响应式 四大特点。可以帮助开发者迅速构建具有响应式全平台应用软件:
张风捷特烈
2024/05/17
2960
Flutter TolyUI 框架#04 | 侧栏菜单设计
推荐阅读
相关推荐
Flutter 知识集锦 | Dart 枚举已支持属性成员
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验