我正在尝试Flutter,而PopupMenuButton
遇到了问题。在菜单中选择一个项目后,我将显示一个没有菜单的新屏幕,并且在向后导航后,弹出菜单仍处于打开状态-如以下屏幕截图所示:
从编辑配置文件屏幕(第二个屏幕截图)导航回到帐户屏幕(第一个屏幕截图)后,弹出菜单仍然打开。我希望将其关闭。我在应用栏内创建弹出菜单的相关代码:
actions: <Widget>[
new PopupMenuButton(
itemBuilder: (BuildContext context) {
return <PopupMenuEntry>[
new AppBarMenuItem("Edit profile", () => Navigator.pushNamed(context, Routes.editProfile)).build(context),
new AppBarMenuItem("Option 1", () => {}).build(context),
new AppBarMenuItem("Option 2", () => {}).build(context),
new AppBarMenuItem("Option 3", () => {}).build(context),
new AppBarMenuItem("Option 4", () => {}).build(context),
];
},
),
],
还有AppBarMenuItem
:
new PopupMenuItem(
child: new InkWell(
child: new Text(_label),
onTap: _onTap,
)
如何确保选择一个项目后关闭弹出菜单?看来,如果我只是在PopupMenuItem
中使用PopupMenuButton
并导航至onSelected
功能中的新屏幕,则菜单将正确关闭。但是当我使用onTap
的{{1}}函数时,它不再关闭。
答案 0 :(得分:3)
如文档中所述,当用户从弹出菜单项中选择一个选项时,弹出菜单应自动关闭。
使用InkWell
onTap不会自动关闭弹出菜单,而是当从popupMenuList中选择一个项目时直接使用弹出菜单项自动关闭弹出菜单。
确保value
的{{1}}属性不为null,否则选择PopupMenuItem
时将不会调用onSelected
函数
答案 1 :(得分:3)
只需在pop
函数onTap
中使用Navigator.pop(context, "$popupValue");
PopupMenuItem<String>(
value: "Replay Game",
child: ListTile(
leading: Icon(Icons.replay,
color: theme.actionButtonColor),
title: Text("Replay Game"),
onTap: () {
Navigator.pop(context, "Replay Game");
showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text("Clear input and replay game?"),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.pop(context),
child: Text("No"),
textColor: theme.alterDialogActionColor,
),
FlatButton(
onPressed: () {
store.dispatch(ReplayAction(timerBloc, varBloc.fireAnalytics));
Navigator.pop(context);
},
child: Text("Yes"),
textColor: theme.alterDialogActionColor,
),
],
);
});
},
),
)
答案 2 :(得分:1)
我遇到了同样的问题,这是我的解决方案。您的PopUpMenuButton()
没有使用onSelected
属性。 onSelected
属性将正确关闭您的PopUpMenuButton
。当前不是因为您的onTap
的{{1}}属性接替了这项工作。
另外,我创建了一个AppBarMenuItem
而不是PopUpMenuItem
的列表,不确定是否会有所作为。但是,对于我的每个PopUpMenuEntry
,我还为每个属性分配了value属性,以便PopUpMenuItem
可以与onSelected
交流被窃听的项目。
类似这样的东西:
PopUpMenuButton()
案例1,案例2等是指我分配给PopupMenuButton(
onSelected: (selection) {
switch (selection) {
case 1:
... do stuff...
break;
case 2:
... break stuff...
);
break;
}
},
的value属性。