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

ops/2025/3/18 9:46:51/

        这个问题应该出现很久了,之前的组件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.ppmy.cn/ops/166734.html

相关文章

人工智能之数学基础:从线性变换理解矩阵范数和矩阵行列式

本文重点 我们已经学习了线性变换了,而且我们知道每一个线性变换都有一个矩阵,那么本文我们从线性变换的角度来理解矩阵范数和行列式。 矩阵范数 为什么要学习范数呢?因为范数是程度概念的推广,在矩阵理论的计算方法中,要讨论收敛问题和逼近问题,那么就需要引入向量和…

【redis】Jedis 操作 Redis 基础指令(下)

列表操作 lpush/rpush 和 lpop/rpop 将一个或者多个元素从左/右侧放入(头/尾插)到 list 中 依次头插 从 list 左/右侧取出元素(即头/尾删) public static void test1(Jedis jedis) { jedis.flushAll(); long n jedis.lpush(…

9种Python数据可视化方案,让财务数据焕发生命力

想象一下:你即将向董事会展示季度财务报告,面对的是一群已经看过无数PPT的高管。你是选择用普通的柱状图和折线图,还是用能够直观展示收入、支出、利润动态关系的交互式仪表板? 本文将通过一个完整的Python财务数据可视化案例&am…

使用 yum 命令安装 MariaDB 指南

文章目录 前言为什么开始选择 MariaDB?安装 MariaDB安装mariadb-server启动服务初始化配置设置开机启动配置远程访问权限 总结个人简介 前言 最近在 CentOS 7 上安装 MySQL 后启动遇到如下错误: systemctl start mysqldFailed to start mysqld.service…

C语言内存函数讲解

(一)memcpy函数 这是memcpy函数的说明。它的头文件是string.h。函数原型是 void* memcpy(void* destination, const void* source, size_t num) 第一个参数是一个指向一个字符串的指针,第二个也是一样的。而第三个参数是复制的字节个数。这…

使用kubeadm方式以及使用第三方工具sealos搭建K8S集群

目录 kubeadm方式: 一、安装要求 二、环境准备 二、安装Docker、kubeadm、kubelet 1、安装Docker (1)首先配置一下Docker的阿里yum源 (2)然后用yum 方式安装docker (3)配置Docker镜像加速器 &#…

文本检测-文本内容审核-文本过滤接口如何用PHP调用?

一、什么是文本检测接口呢? 文本内容审核过滤,提供对敏感事件、违规词语及监管要求封禁词语的识别审核能力,包含海量历史数据,有效过滤违禁违规、恶意推广、低俗辱骂、低质灌水、广告法审核,该接口应用场景广泛&#…

ONNX:统一深度学习工作流的关键枢纽

引言 在深度学习领域,模型创建与部署的割裂曾是核心挑战。不同框架训练的模型难以在多样环境部署,而 ONNX(Open Neural Network Exchange)作为开放式神经网络交换格式,搭建起从模型创建到部署的统一桥梁,完…