使用showMenu()函数时如何处理PopupMenuItem的点击事件

7
我正在使用showMenu()来显示弹出菜单。通常情况下,使用PopupMenuButton会有onSelected选项,但在showMenu()中似乎没有该选项。

我尝试将PopupMenuItem的内容包装在GestureDetector中,但这样会使可点击区域变得太小。如下图所示,较小的矩形是我的GestureDetector(可以工作但太小),而PopupMenuItem自带的Inkwell则是较大的矩形。

GestureDetector inside PopupMenuItem

所以我的问题是,在没有onSelected属性的情况下,我应该如何处理PopupMenuItem的选择?

编辑:

这是代码。我有许多ListTiles,在长按时调用此方法:

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

showMenu(
  context: context,
  position: RelativeRect.fromRect(
    // magic code from stackoverflow, 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中,因为items属性仅允许使用PopupMenuItems。


我该怎么做呢?你无法访问/更改 PopupMenuItem 中的 inkwell onTap 属性。 - steellow
我正在使用showMenu函数。好的,需要知道的是,我已经在原帖中添加了一些代码。 - steellow
1个回答

8

不需要将项目包装到手势检测器中... show menu是一个异步方法,它返回菜单项的值。当您按下任何项目时,您会收到该按下项目的值。通过该值,您可以做任何您想做的事情。请查看此代码。

 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');
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接