iPadOS 26.1上Flutter弹窗/抽屉打开后立即关闭的问题咨询
iPadOS 26.1上Flutter弹窗/抽屉打开后立即关闭的问题咨询
这个问题我上周帮同事排查的时候刚碰到,确实是Flutter 3.35.x和iPadOS 26.1之间的适配bug——系统在处理iPad的触摸事件时,会把抽屉/弹窗打开瞬间的交互误判为遮罩区域的点击,尤其是当barrierDismissible设为true时,就会出现刚打开就闪关的情况,偶尔正常是因为触摸事件的判定存在随机性。目前这个问题已经有不少开发者在官方渠道上报了,团队应该正在跟进修复。
给你几个亲测有效的临时解决办法:
延迟开启遮罩可关闭属性
初始打开抽屉/弹窗时把barrierDismissible设为false,等组件稳定显示后再延迟几百毫秒开启这个属性,绕开系统的误判逻辑。示例代码如下:bool _allowBarrierDismiss = false; void _openEndDrawer() { setState(() { _allowBarrierDismiss = false; }); Scaffold.of(context).openEndDrawer(); // 延迟300ms开启遮罩关闭权限,时间可以根据自己的UI调整 Future.delayed(const Duration(milliseconds: 300), () { if (mounted) { setState(() { _allowBarrierDismiss = true; }); } }); }之后在打开抽屉或弹窗的方法里,传入
barrierDismissible: _allowBarrierDismiss即可。手动接管遮罩触摸事件
给遮罩层套一个GestureDetector,手动控制关闭逻辑,避免系统的默认事件触发。比如做弹窗时可以这么写:showDialog( context: context, barrierDismissible: false, // 先关闭系统默认的遮罩关闭 builder: (context) { return GestureDetector( // 只有用户明确点击遮罩时才关闭 onTap: () => Navigator.of(context).pop(), behavior: HitTestBehavior.translucent, child: const Center( child: YourDialogContent(), // 你的弹窗内容组件 ), ); }, );这种方法相当于完全接管了遮罩的交互,从根源上避免误触发。
临时降级Flutter版本
如果项目对新版本特性没有强依赖,可以暂时降级到Flutter 3.34.x版本,这个版本在iPadOS 26.1上不会出现这个问题,等官方发布修复补丁后再升级回去。
另外提醒一下,官方的修复补丁应该会在Flutter 3.35的后续小版本或者3.36版本中推出,你可以多关注一下Flutter的更新日志,等版本更新后直接升级就能彻底解决这个问题了。




