当前位置: 首页 > news >正文

Flutter PopScope对于iOS设置canPop为false无效问题

        这个问题应该出现很久了,之前的组件WillPopScope用的好好的,flutter做优化打算“软性”处理禁用返回手势,出了PopScope,这个组件也能处理在安卓设备上的左滑返回事件。但是iOS上面左滑返回手势禁用,一直无效。

当然之前一直在使用Navigator动态路由的方式的话是不影响的。

Navigator.push(context,MaterialPageRoute(
                        builder: (context) =>
                            FullScreenImagePage(images: [imagePath]),
                      ),
                    );

        但是对于静态路由和一些其他三方的路由(fluro,go_route,getx(这个在版本4.7.2中已修复))封装组件就会有影响。

那我们看下具体为什么会出现这种问题?

        首先我们看PopScope的内部实现是接口实现了PopEntry的一个ValueNotifier  canPopNotifier来控制内部的返回手势是否可用。

ModelRoute注册该事件,然后在这个抽象类中有统一的返回手势判断竞技场逻辑:

到此暂告一段落。

        上面我们说Navigator的动态路由方式没问题,那么就看下他的处理和其他的路由方式的差别:MaterialPageRoute的混入MaterialRouteTransitionMixin如下:

CupertinoPageRoute的混入CupertinoRouteTransitionMixin如下(我只截取了最有介绍的部分,想看的可以自己去文件里面看,路径我已经截出来了):

                

        Flutter最近也一直在优化Cupertinao的组件库,上面的CupertinoPageRoute就是iOS的路由处理,可以看到差异很明显,页面page(这篇文章主要介绍page形式)形式的代码有自定义实现了手势_CupertinoBackGestureDetector,他通过参数方法enabledCallback来动态获取左滑手势是否有效。它的内部实现如下:

        可以看到enabledCallback的来源是route.popGestureEnabled,到此就是最终的位置了。通过断点可以看到,(前提是二级页面设置了PopScope的canPop为false)当Navigator的动态路由方式的时候,此处是false,左滑返回无效,一般其他的方式路由来的此处是true,左滑返回可以。

        由此而来,问题就出现在了route的popGestureEnabled上面,我们可以聚焦在此处,点击寻根,可以追溯到ModalRoute的popGestureEnabled(上面已截图,本文第三张图),问题就出在了第三个判断中的popDisposition==RoutePopDisposition.doNotPop上面,再往上看popDisposition的来源如下:

        问题的原因应当是此处路由在iOS设备中路由的转换导致canPopNotifier的变更出现的问题。

下面我们参考看下Get的PageRoute解决关键代码:

        可以看到GetX的最新调整将路由的手势带出来,判断处理 解决此次Flutter的iOS PopScope问题。(当然这只是表象比较明显的位置,具体详细大家有兴趣可以自行点进去再细致研究)

http://www.dtcms.com/a/69500.html

相关文章:

  • 网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合
  • 用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件
  • 如何判断一个项目用的是哪个管理器
  • PhotoMill X for Mac v2.8.1 图片批量编辑工具 支持M、Intel芯片
  • TypeScript 高级类型 vs JavaScript:用“杂交水稻”理解类型编程
  • AWK 入门教程:强大的文本处理工具
  • 区块链知识点2
  • Blender学习方法与技巧
  • React19源码系列之FiberRoot节点和Fiber节点
  • Linux网络编程——UDP网络通信的简单实现
  • Android UI 组件系列(二):Button 进阶用法
  • 第五天 Labview数据记录(5.4 EXCEL文件读写)
  • 安装 oepn-webui报错 Cannot connect to host api.openai.com:443 ssl
  • 网络空间安全(31)安全巡检
  • 将 IPoIB 驱动修改为仅使用 RC 模式
  • X86 RouterOS 7.18 设置笔记七:不使用Upnp的映射方法
  • 《实战AI智能体》DeepSearcher 的架构设计
  • Docker Desktop 安装与使用详解
  • Linux中Gdb调试工具常用指令大全
  • JVM系统变量的妙用
  • 封装WPF中转换器常用用法封装
  • 北京凝思磐石系统6.0.80安装vm warea tools
  • 【鸿蒙5.0】关于使用卓易通的“文件互传”功能时提示单次导出数量限制为30的一种解决思路
  • UdpClient
  • Chat-TTS-UI:文字转语音 - 本地部署方案
  • 【K8s】 K8s Pod如何通过HostAliases字段配置Host
  • Jmeter下载及环境配置
  • LinuX---Shell脚本创建和执行
  • fastapi+angular实现Tcp在线聊天室功能
  • 大白话阐述react和vue高阶组件的概念、优势及应用场景,以及区别,给出简单高阶组件的实现代码