You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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的更新日志,等版本更新后直接升级就能彻底解决这个问题了。

火山引擎 最新活动