You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中PopupMenuItem的onTap事件无法触发Navigator页面跳转问题

问题根因

弹出菜单本质是一个独立的PopupRoute路由,点击PopupMenuItem时,Flutter内置逻辑的执行顺序为:

  1. 先执行你传入的onTap回调
  2. 再自动执行Navigator.pop操作,关闭当前的菜单路由

当你在onTap中同步调用Navigator.push时,导航栈会先新增SettingsPage到栈顶,紧接着内置的pop操作就把刚入栈的SettingsPage直接弹出,因此出现函数执行正常但看不到跳转结果的现象,全程不会抛出错误。
而IconButton点击时没有附带的pop操作,导航栈不会被后续逻辑修改,因此跳转正常。

你现在使用的PopupMenuButton.onSelected是官方推荐的标准菜单点击处理方案,它的触发时机是在菜单路由完全关闭之后,此时执行跳转不会被后续操作打断,是最规范的解法。

可选兼容方案(如确实需要在PopupMenuItem.onTap中处理跳转)

只需要把跳转逻辑延迟到内置的pop操作执行完成后再触发即可,两种实现方式:

  1. 利用帧回调延迟执行
PopupMenuItem(
  child: Text(AppLocalizations.of(context).settings),
  onTap: () {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _openSettings(ctx);
    });
  },
)
  1. 零时长异步延迟
PopupMenuItem(
  child: Text(AppLocalizations.of(context).settings),
  onTap: () => Future.delayed(Duration.zero, () => _openSettings(ctx)),
)

内容的提问来源于stack exchange,提问作者finisinfinitatis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:54:03