Flutter :从PopupMenuItem点击时对话框不工作

7kqas0il  于 2023-05-23  发布在  Flutter
关注(0)|答案(7)|浏览(278)
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无法使用以前的代码打开。但它的打开正确地从另一个按钮点击

zyfwsgd6

zyfwsgd61#

试试这个

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

lzfw57am2#

我今天遇到了同样的问题,几分钟后,我意识到你不能使用onTap。您必须使用PopupMenuButton的onSelected。
参见:enter link description here

s2j5cfk0

s2j5cfk03#

您可以使用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,
        ),
      ),
uemypmqf

uemypmqf4#

您可以检查以下步骤:
1.为了进行研究,我们需要一个最小的可运行的复制文件,这样我们就可以将代码复制到一个新项目的lib/main.dart中,然后运行复制文件
1.如果没有更多的信息,我们很遗憾不知道如何解决这个问题。因此,我们现在不情愿地关闭这个bug。如果您有任何更多的信息,请不要犹豫,对错误发表评论;我们马上重新开放!感谢您的贡献。
1.您的itemBuilder函数不返回任何内容。它缺少return关键字。

3duebb1j

3duebb1j5#

我今天也遇到了同样的问题。在调试时,我知道在执行onTap方法后,Navigator.of(context).pop();会被调用一次。这就是为什么你的cancelDialog是不可见的。实际上,它是在调用showDialog方法时打开的,但它也会很快弹出。对于解决方案,您只需调用cancelDialog方法两次。因此,即使后一个弹出,前一个仍然在屏幕上可见。

onTap: () {
     cancelDialog();
     cancelDialog();
},

用上面的方法替换旧的onTap方法就可以了。

u91tlkcl

u91tlkcl6#

您可以遵循此解决方案:enter link description here
简而言之,您应该将函数变形为:

WidgetsBinding?.instance?.addPostFrameCallback((_) {/* your function */}
hpcdzsge

hpcdzsge7#

根据这个答案,PopUpMenuItem的onTap函数必须按如下所示调用,而不是直接调用showDialog。相反,首先调用widgetsBidingInstance,以便在调用ontap函数后显示对话框,该函数在点击时关闭PopUpMenuItem。

onTap: (){

 WidgetsBiding.instance.addPostFrameCallback((){
    showDialog(
    context: context,
    builder:(BuildContext context)=> AlertDialog(title: Text("This is Title"),),
    
    ),
        });
}

相关问题