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();
},
),
],
);
},
);
}
CodePudding user response:
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();
});
},
CodePudding user response:
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.