Here is my PopupMenuButton

                        PopupMenuButton(
                            icon:
                                Icon(Icons.more_vert, color: Colors.white),
                            itemBuilder: (context) => [
                                  PopupMenuItem(
                                    onTap: () {
                                      showMyDialog();
                                    },
                                    child: Text(
                                      "Edit Profile Picture",
                                      style: TextStyle(
                                          color: AppColors.pinkColor),
                                    ),
                                    value: 1,
                                  ),
                                  PopupMenuItem(

                                    child: Text(
                                      "Edit  Cover Picture",
                                      style: TextStyle(
                                          color: AppColors.pinkColor),
                                    ),
                                    value: 2,
                                  ),
                                  PopupMenuItem(

                                    child: Text(
                                      "Setting",
                                      style: TextStyle(
                                          color: AppColors.pinkColor),
                                    ),
                                    value: 3,
                                  )
                                ])

And this is my Dilaogue function

Future<void> _showMyDialog() async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('AlertDialog Title'),
          content: SingleChildScrollView(
            child: ListBody(
              children: const <Widget>[
                Text('This is a demo alert dialog.'),
                Text('Would you like to approve of this message?'),
              ],
            ),
          ),
          actions: <Widget>[
            TextButton(
              child: const Text('Approve'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }


Solution 1: AML

Let's say that if you've declared function as _showMyDialogue(), then you should use showMyDialogue() when calling that function. In your case, you Ignored "" while calling it. That's the problem.


Solution 2: Yeasin Sheikh

onTap of PopupMenuItem call Navigator.pop after tapping on any item on PopupMenuButton to close it.

 void handleTap() {
    widget.onTap?.call();

    Navigator.pop<T>(context, widget.value);
  }

When you tap the item it shows _showMyDialog() but close it immediately because of Navigator.pop called and that's why you can find PopupMenuItem is open after tap.

Simply Navigator.pop is closing the showDialog instead of PopupMenuButton's items. We can provide some delay to close the PopupMenuItem then can call _showMyDialog();

PopupMenuItem(
  onTap: () {
    Future.delayed(Duration.zero).then((value) {
      _showMyDialog();
    });
  },