Flutter中PopupMenuItem的onTap事件无法触发Navigator页面跳转问题
问题根因
弹出菜单本质是一个独立的PopupRoute路由,点击PopupMenuItem时,Flutter内置逻辑的执行顺序为:
- 先执行你传入的
onTap回调 - 再自动执行
Navigator.pop操作,关闭当前的菜单路由
当你在onTap中同步调用Navigator.push时,导航栈会先新增SettingsPage到栈顶,紧接着内置的pop操作就把刚入栈的SettingsPage直接弹出,因此出现函数执行正常但看不到跳转结果的现象,全程不会抛出错误。
而IconButton点击时没有附带的pop操作,导航栈不会被后续逻辑修改,因此跳转正常。
你现在使用的PopupMenuButton.onSelected是官方推荐的标准菜单点击处理方案,它的触发时机是在菜单路由完全关闭之后,此时执行跳转不会被后续操作打断,是最规范的解法。
只需要把跳转逻辑延迟到内置的pop操作执行完成后再触发即可,两种实现方式:
- 利用帧回调延迟执行
PopupMenuItem( child: Text(AppLocalizations.of(context).settings), onTap: () { WidgetsBinding.instance.addPostFrameCallback((_) { _openSettings(ctx); }); }, )
- 零时长异步延迟
PopupMenuItem( child: Text(AppLocalizations.of(context).settings), onTap: () => Future.delayed(Duration.zero, () => _openSettings(ctx)), )
内容的提问来源于stack exchange,提问作者finisinfinitatis
相关产品推荐
相关产品推荐

