使用 showMenu() 时如何处理 PopupMeniItem 按下

How to handle PopupMeniItem presses when using showMenu()

我正在使用 showMenu() to dispaly popup menu. Usually when you use PopupMenuButton it has the onSelected 选项,但您似乎没有使用 showMenu()。

我尝试将 PopupMenuItem 的内容包装在 GestureDetector 中,但这使得可点击区域太小了。见下图,较小的矩形是我的 GestureDetector(可以使用但太小了),较大的矩形是 PopupMenuItem 附带的墨水池。

所以我的问题是,当我没有 onSelected 属性 时,我应该如何处理 PopupMenuItem 按下?

编辑:

这是代码。我有 ListTiles,它在 LongPress 上调用此方法:

void _showOptionsMenu(int hiveIndex) {
    final RenderBox overlay = Overlay.of(context).context.findRenderObject();

showMenu(
  context: context,
  position: RelativeRect.fromRect(
    // magic code from Whosebug, positions the PopupMenu on your tap location
    _tapPosition & Size(40, 40),
    Offset.zero & overlay.size,
  ),
  items: [
    PopupMenuItem(
      value: 0,
      child: Row(
        children: [
          Icon(Icons.edit),
          Text("Edit"),
        ],
      ),
    ),
    PopupMenuItem(
      value: 1,
      child: Row(
        children: [
          Icon(Icons.delete),
          Text("Delete"),
        ],
      ),
    ),
  ],
);

您不能将 PopupMenuItems 包装在 GestureDetector 中,因为项目 属性 只允许 PopupMenuItems。

无需将项目包装到手势检测器中。显示菜单是一种异步方法,其中 returns 项目菜单的值。当您按下任何项目时,您将取回该按下项目的值。有了这个价值,你可以做任何你想做的事。检查此代码

 Future<void> _showOptionsMenu(int hiveIndex) async {
    int selected = await showMenu(
      position: RelativeRect.fromLTRB(60.0, 40.0, 100.0, 100.0),
      context: context,
      items: [
        PopupMenuItem(
          value: 0,
          child: Row(
            children: [
              Icon(Icons.edit),
              Text("Edit"),
            ],
          ),
        ),
        PopupMenuItem(
          value: 1,
          child: Row(
            children: [
              Icon(Icons.delete),
              Text("Delete"),
            ],
          ),
        ),
      ],
    );
    if (selected == 0) {
      print('handle edit');
    } else {
      print('handle delete');
    }
  }