Flutter:从PopupMenuItem点击无法弹出对话框

10
    showMenu(
      context: context,
      position: RelativeRect.fromLTRB(5000, appBar.preferredSize.height + statusBarHeight!, 0.0, 0.0),
      items: [
        PopupMenuItem(
          child: Text('Cancel'),
          value: 0,
          onTap: () {
            cancelDialog();
          },
        ),
      ],
    );

  cancelDialog() {
    return () {
      showDialog(
        context: context,
        builder: (BuildContext context) => OrderCancel(order!.orderId!),
      );
    };
  }

cancelDialog无法使用之前的代码打开。但是它可以从其他按钮点击中正常打开。

7个回答

5

试一下这个

onTap: () {
           Future.delayed(
                  Duration.zero,
                  () => cancelDialog();
           )
          },

看起来是有效的,但我想知道为什么有效? - nbloqs

3
我今天遇到了同样的问题,经过几分钟的尝试后,我意识到你不能使用onTap来解决这个问题。你必须使用PopupMenuButton的onSelected方法。
参考:链接

它仍然不能正常工作。 - genericUser

1
您可以使用PopupMenuButton
      PopupMenuButton<String>(
        onSelected: onItemSelected,
        shape: RoundedRectangleBorder(
          borderRadius: 8.circularRadius,
        ),
        itemBuilder: (context) => const [
          PopupMenuItem(
            value: 'add',
            child: Text(
              'Add',
            ),
          ),
        ],
        child: const Icon(
          Icons.menu_rounded,
          color: Colors.white,
          size: 16,
        ),
      ),

0
今天我也遇到了同样的问题。在调试过程中,我发现在执行onTap方法后,Navigator.of(context).pop();只被调用了一次。这就是为什么你的cancelDialog不可见的原因。实际上,当showDialog方法被调用时,它会打开,但也很快就被弹出了。
至于解决方案,你可以调用cancelDialog方法两次。这样即使后面一个被弹出了,前面一个也会保持在屏幕上可见。
onTap: () {
     cancelDialog();
     cancelDialog();
},

用上面的方法替换旧的onTap方法即可。

2
这个可以运行,但是我们需要调用两次函数,感觉有点奇怪。难道没有更好的解决方案吗? - Intellect

0

您可以按照以下步骤进行检查:

  1. 为了调查问题,我们需要一个最小的可运行复制品,作为单个文件,以便我们可以将您的代码复制到新项目的lib/main.dart中并运行以重现。

  2. 没有其他信息,我们不确定如何解决此问题。因此,我们不情愿地现在关闭此错误。如果您有更多信息,请随时在错误上发表评论;我们会立即重新打开它!感谢您的贡献。

  3. 您的itemBuilder函数没有返回任何内容。它缺少return关键字。


0
根据这个答案,PopUpMenuItem的onTap函数必须按照下面所示进行调用,而不是直接调用showDialog。相反,先调用widgetsBidingInstance以便在调用关闭被点击的PopUpMenuItem的ontap函数后显示对话框。
   onTap: (){
WidgetsBiding.instance.addPostFrameCallback((){ showDialog( context: context, builder:(BuildContext context)=> AlertDialog(title: Text("This is Title"),), ), }); }

0
你可以按照这个解决方案进行操作:在此输入链接描述 简而言之,你应该将你的函数包装在其中:
WidgetsBinding?.instance?.addPostFrameCallback((_) {/* your function */}

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