开启生长之旅!这是我参与「日新方案 12 月更文挑战」的第14天,点击检查活动详情

Flutter Web 系列

《Flutter Web – 让 Web 与 APP UI 共同的另一种或许》

《Flutter Web – 高雅的兼容 Flutter App 代码》

(日新方案的最终一更,献给这个天坑)[真狗头]。

最近一向在调试 Flutter for Web 项目,现已到了最终小问题调整的阶段。但这些小问题有的的确非常的棘手,并且以 iOS Safari 的居多。比如前几天发的 《Flutter Web – 如何适配 iphone 安全区域》 便是底部栏适配 Safari 呈现的问题。

必须先吐槽 Flutter 官方,这是有多瞧不上 iOS Safari [狗头*10086] …

问题描绘

直接看录的 Demo 视频(伪,还不支撑上传视频,转成 gif):

找到一个(不)合适的滑动办法(不正常的概率仍是比较大的),就能够把页面变得要多古怪就有多古怪,像是抽风了一样,但假如是运用浏览器的回来或者导航栏的回来都是正常的 …

实践进程

其实这个问题在 Flutter 多引擎烘托组件开发的现已留意到了,只不过一向觉得是小问题,所以拖到项目上把 App 页面烘托到 Web 上的调试阶段时,才预备处理一下。

禁用侧滑回来

最开端并没有想到是 Safari 本身的问题,只觉得是 Flutter 路由动画上有问题,有问题就想着先禁用掉侧滑回来看看,所以直接在根节点加上 WillPopScope

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: WillPopScope(
        onWillPop: () async => false,
        child: ...,
      ),
    );

然并卵,禁用不了侧滑回来,该什么样就什么样 …

与 Android 对比

想到跟 Android 对比下,但手上没有真机,就在公司的真机平台试了试

Flutter Web - 分析在  iOS Safari 上侧滑返回异常的问题

彻底没办法侧滑,说明 WillPopScope 操控仍是有用的,但对 iOS 浏览器没作用。

寻觅原因

这时能够确认应该是在 iOS 浏览器的适配上有问题,这时候就只能 Google 来寻觅处理方案了,感觉应该也是一个普适性问题,但一开端的确没搜到,搜索姿势不对,侧滑回来要搜 “swiped back” 公然 github 上的确有类似的问题,传送门:

github.com/flutter/flu…

github.com/flutter/flu…

github.com/flutter/flu…

都是 open 状况,并且最早的是在2020年就提出来了,评级 P5,根本没有人想去处理(当然,比起 Flutter 那么多高 P 的 issues,或许真的是没工夫处理这种“小问题”)。

里面的谈论这里总结下,问题的原因是:在触发到体系的侧滑回来后,Flutter 会重新加载整个 Web 应用,并且这个加载进程并不是正常的,所以有各种各样的古怪现象。

暂时处理办法

那如何破局?谈论里找到一个办法,经过拦截边缘的响应事件,来削减呈现的频率。

      window.addEventListener("load", function () {
        var loading = document.querySelector("#loading");
        _flutter.loader
          .loadEntrypoint({
            serviceWorker: {
              serviceWorkerVersion: serviceWorkerVersion,
            },
          })
          ....
          .then(function (_) {
            const flutterRoot = document
              .getElementsByTagName("flt-glass-pane")
              .item(0);
            flutterRoot.addEventListener("touchstart", (e) => {
              if (e.pageX > 24 && e.pageX < window.innerWidth - 24) return;
              e.preventDefault();
            });
          });
      });

flt-glass-pane 标签增加 touchstart 监听,假如手势起点在左右两头 24 边距内则忽略。

这办法笔者加了试了,的确能够降低概率,但仍是不能彻底避免。并且假如界面上有边缘操作,那或许会被阻挡 …

后续

假如是在自己的 App 上加载的话,就很简单禁用掉侧滑回来。

但这个 Wap 项目最终是在微信小程序中加载,所以想着咱们在微信小程序中禁用掉侧滑回来不就好了,找到 disableSwipeBack 禁用办法,但用不了了:

Flutter Web - 分析在  iOS Safari 上侧滑返回异常的问题

微信:我支撑禁用了侧滑回来,过了 0.0.5 个版别,我又不支撑了,我任性,你气不气?

Flutter Web - 分析在  iOS Safari 上侧滑返回异常的问题

所以至此,只能用上述的暂时处理办法,以及把 SPA 的 Flutter Web 开端拆分红多个 web-view 加载来尽或许削减用户误操作的概率了 …

但回过头来想一想,同样是 SPA,为什么 Vue / React 没有这种问题?感觉 Flutter for Web 应该也有彻底处理的办法,但需要有时间去深追源码了。


感谢阅览,假如对你有用请点个赞 ❤️

Flutter Web - 分析在  iOS Safari 上侧滑返回异常的问题