Flutter 如何从代码中显示PopupMenuButton的菜单

Flutter 如何从代码中显示PopupMenuButton的菜单,flutter,Flutter,PopupMenuButton在用户单击时打开一个菜单。但是如何在代码中的PopupMenuButton所在的位置打开相同的菜单(例如,由于另一个用户事件) 我正在尝试在AppBar中创建嵌套菜单。比如,当用户点击“排序方式”时,菜单会变为其他内容。有没有其他方法可以做到这一点?我在互联网上找不到它。如果你看一看,你会发现它使用了showMenu方法,即使在按钮的上下文之外也可以访问该方法(可能与导入的材料省道类一起) 定义一个GlobalKey变量,并将其应用于您的PopupMenuButto

PopupMenuButton在用户单击时打开一个菜单。但是如何在代码中的PopupMenuButton所在的位置打开相同的菜单(例如,由于另一个用户事件)

我正在尝试在AppBar中创建嵌套菜单。比如,当用户点击“排序方式”时,菜单会变为其他内容。有没有其他方法可以做到这一点?我在互联网上找不到它。

如果你看一看,你会发现它使用了
showMenu
方法,即使在按钮的上下文之外也可以访问该方法(可能与导入的
材料
省道类一起)

定义一个
GlobalKey
变量,并将其应用于您的
PopupMenuButton
以引用按钮的上下文-这就是我们获取按钮在屏幕上位置的方式

为菜单创建一个项目数组,稍后在编程调用和物理按钮本身中重用它

计算菜单出现的位置,并调用
showMenu

showMenu
返回一个未来-聆听它的完成以获取所选项目


//在“build”上的按钮和编程调用都可以访问的地方定义这些变量。
最终popupButtonKey=GlobalKey();//我们之所以使用'State',是因为flatter libs没有专门导出'PopupMenuButton'状态。
最终列表菜单=[
PopupMenuItem(
价值:1,
子项:文本(“一”),
),
PopupMenuItem(
价值:2,
child:Text('Two'),
),
];
在您的
构建中

弹出菜单按钮(
键:popupButtonKey,
initialValue:null,
itemBuilder:()=>菜单项,
// ...
);
要以编程方式显示菜单,请执行以下操作:

//这里我们获取物理按钮的渲染对象,稍后获取其大小和位置
最终RenderBox popupButtonObject=popupButtonKey.currentContext.FindEnderObject();
//获取“导航器”/“MaterialApp”中使用的覆盖的渲染对象,即屏幕大小参考
final RenderBox overlay=overlay.of(context.context.findenderobject();
//根据用作坐标空间的“叠加”,使用按钮的大小和位置计算下拉列表的显示区域。
最终相对竖立位置=相对竖立.fromRect(
矩形起点(
popupButtonObject.localToGlobal(Offset.zero,祖先:overlay),
localToGlobal(popupButtonObject.size.bottomRight(Offset.zero),祖先:overlay),
),
Offset.zero和overlay.size,//与:new Rect.fromLTWH(0.0,0.0,overlay.size.width,overlay.size.height)相同
);
//最后,显示菜单。
展示菜单(
上下文:上下文,
标高:8.0,//默认值
项目:菜单,
initialValue:null,
职位:职位,,
).然后((res){
印刷品(res);
});

工作起来很有魅力。谢谢我以前不知道GlobalKey的事。代码中的注释帮助很大。是获取小部件引用的相对昂贵的方法。但它非常适合您的情况,因为我想,
PopupMenuButton
是唯一的。另一件需要记住的事情是,
popupButtonKey.currentContext
如果按钮还没有初始化,则可能为空。@George如何降低成本?@omega_prime只要你不过度使用它(每个小部件不超过一个键)-你应该很好。@George谢谢,尽管我不确定如何使用您的代码实际执行此操作。我正试图模仿它来作为一个自动完成的工具,因为web插件似乎不起作用。您是否能够编辑您的代码,为我和其他可能陷入困境的人提供更完整的示例。谢谢