PopupMenuButton 小部件在其状态类中没有 onPressed 方法。相反,它有一个 onSelected 属性,您可以使用它来处理菜单项的选择。
要在点击单独的 GestureDetector 时打开弹出菜单,可以使用 PopupMenuButtonState 类的 showButtonMenu 方法,该类是 PopupMenuButton 的状态类。您可以通过调用 dotsKey.currentState 获取状态实例。
这是一个示例,说明如何使用 PopupMenuButton 和单独的 GestureDetector 与 Stack 来实现您想要的:
class MyWidget extends StatelessWidget {
final dotsKey = GlobalKey<PopupMenuButtonState<String>>();
@override
Widget build(BuildContext context) {
return Stack(
children: [
GestureDetector(
onTap: () {
// Show the popup menu when tapping on the GestureDetector
dotsKey.currentState.showButtonMenu();
},
child: Icon(Icons.more_vert),
),
Positioned(
// Position the PopupMenuButton at the same position as the icon
child: PopupMenuButton<String>(
key: dotsKey,
onSelected: (String value) {
// Handle the menu item selection
print('Selected: $value');
},
itemBuilder: (BuildContext context) => [
PopupMenuItem(
value: 'Item 1',
child: Text('Item 1'),
),
PopupMenuItem(
value: 'Item 2',
child: Text('Item 2'),
),
],
),
),
],
);
}
}
这样,GestureDetector 位于 PopupMenuButton 图标上方,当它被点击时,将在从 dotsKey.currentState 获得的 PopupMenuButtonState 实例上调用 showButtonMenu 方法。 PopupMenuButton 的 onSelected 属性用于处理菜单项的选择。