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.pswp.cn/pingmian/72321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72321.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基爾霍夫定律課后學習日志

基爾霍夫定律課后日志 今天在學習基爾霍夫定律后,我對它在實際工程中的價值有了全新的認識。 基爾霍夫電流定律(KCL)和電壓定律(KVL)是電路分析的基石。在電子電路設計領域,這兩個定律發揮著關鍵作用。以…

矩陣交換行(信息學奧賽一本通-1119)

【題目描述】 給定一個55的矩陣(數學上,一個rc的矩陣是一個由r行c列元素排列成的矩形陣列),將第n行和第m行交換,輸出交換后的結果。 【輸入】 輸入共6行,前5行為矩陣的每一行元素,元素與元素之間以一個空格分開。 第6行包含兩個整…

SWPU 2022 新生賽

webdog1__start if (isset($_GET[web])) {$first$_GET[web];if ($firstmd5($first)) md5 自等 web0e215962017 (md5后也是 0e) 登入后得到提示,robots.txt 訪問 f14g.php 返回包里發現 hint > if (isset($_GET[get])){$get$_GET[get];if(!strs…

什么是 Redis

Redis(Remote Dictionary Server)是一個開源的、基于內存的鍵值存儲系統,常用作數據庫、緩存和消息中間件。它支持多種數據結構,如字符串、哈希、列表、集合、有序集合等,并提供豐富的操作命令。 主要特點 高性能&am…

海數通-海員數字化管理平臺(企業數字化)

產品介紹 海數通產品是一套海員數字化管理平臺,為企業提供海員檔案、海歷、動態、證書、培訓、晉升、薪資、社險等全流程多維度的智能化管理能力。薪資計算模型和社險計算模型能夠自動并準確的完成復雜的工資、社險計算工作,極大的提高工作效率和準確性…

如何處理PHP中的日期和時間問題

如何處理PHP中的日期和時間問題 在PHP開發中,日期和時間的處理是一個常見且重要的任務。無論是記錄用戶操作時間、生成時間戳,還是進行日期計算,PHP提供了豐富的函數和類來幫助開發者高效處理這些需求。本文將詳細介紹如何在PHP中處理日期和…

【SpringMVC】入門版

1.基本概念 1.1三層架構 三層架構也就是我們常說的b/s架構中的表現層,業務層和持久層,每層都各司其職,下面來分別講解這三層的作用。 表現層: 也就是我們常說的web層。它負責接收客戶端的請求,向客戶端響應結果,通…

【Java進階學習 第八篇】石頭迷陣游戲

繪制頁面 首先繪制指定寬和高的窗體 JFrame frame new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石頭迷陣單機版v1.0");//想讓游戲一直在屏幕的最上層frame.setAlwaysOnTop(true);//想讓窗…

wireguard搭配udp2raw部署內網

前言 上一篇寫了使用 wireguard 可以非常輕松的進行組網部署,但是如果服務器廠商屏蔽了 udp 端口,那就沒法了 針對 udp 被服務器廠商屏蔽的情況,需要使用一款 udp2raw 或 socat 類似的工具,來將 udp 打包成 tcp 進行通信 這里以…

Node.js REPL 深入解析

Node.js REPL 深入解析 引言 Node.js 作為一種流行的 JavaScript 運行環境,在服務器端開發中扮演著重要角色。REPL(Read-Eval-Print Loop,讀取-求值-打印循環)是 Node.js 的一個核心特性,它允許開發者在一個交互式環境中執行 JavaScript 代碼。本文將深入探討 Node.js R…

系統可觀測性(5)OpenTelemetry基礎使用

系統可觀測性(5)OpenTelemetry基礎概念 Author: Once Day Date: 2025年3月12日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 本文檔翻譯整理自《OpenTelemetry Docs》&a…

AVL樹的平衡算法的簡化問題

AVL樹是一種緊湊的二叉查找樹。它的每個結點,都有左右子樹高度相等,或者只相差1這樣的特性。文章https://blog.csdn.net/aaasssdddd96/article/details/106291144給出了一個例子。 為了便于討論,這里對AVL樹的結點平衡情況定義2個名稱&#…

Jenkins 集成DingDing 推送

現狀分析 開發頻繁發布代碼,和測試沒有及時溝通,導致測試返工、bug漏測等 解決方案 Jenkins 集成DingDing機器人,在構建時觸發推送 DingDing端機器人配置 1、在釘釘電腦端建立群聊 2、點擊群右上角設置,點擊【智能群助手】 …

【Quarkus】通過Quarkus集成后端服務示例

說明: REST資源接口(AuthResource)。REST資源實現類(AuthResourceImpl)。服務接口(AuthService)。服務實現類(AuthServiceImpl)。配置文件(application.prop…

硬件驅動——51單片機:獨立按鍵、中斷、定時器/計數器

目錄 一、獨立按鍵 1.原理 2.封裝函數 3.按鍵控制點燈 數碼管 二、中斷 1.原理 2.步驟 3.中斷寄存器IE 4.控制寄存器TCON 5.打開外部中斷0和1 三、定時器/計數器 1.原理 2.控制寄存器TCON 3.工作模式寄存器TMOD 4.按鍵控制頻率的動態閃爍 一、獨立按鍵 1…

基于PMU的14節點、30節點電力系統狀態估計MATLAB程序

“電氣仔推送”獲得資料(專享優惠) 程序簡介: 程序采用三種方法對14節點和30節點電力系統狀態進行評估: ①PMU同步向量測量單元結合加權最小二乘法(WLS)分析電力系統的電壓幅值和相角狀態; …

Apifox Helper 自動生成API接口文檔

在我們開發過程中我們在編寫請求地址和編寫請求參數的時候特別花費時間耗費了我們很多時間,作為一個程序員,更應該把精力時間集中在開發上, Apifox Helper 是 Apifox 團隊針對 IntelliJ IDEA 環境所推出的插件,可以在 IDEA 環境中…

Python 3.13實現數據未來預測功能(詳細功能實現及環境搭建)

目錄 摘要 1. 導入所需庫 2. 加載和查看數據 3. 數據預處理 4. 拆分數據集 5. 模型訓練 6. 模型評估 7. 進行預測 結論 摘要 本文將引導您使用Python 3.13實現數據預測功能。我們將使用常用的Python庫, 如pandas、numpy和sklearn,來幫助讀者快速搭建一個簡…

基于Redis實現限流的幾種方式

限流盡可能在滿足需求的情況下越簡單越好! 分布式限流是指在分布式系統中對請求進行限制,以防止系統過載或濫用資源。以下是常見的分布式限流策略及其實現方式: 1、基于 Redis 的固定窗口限流 原理: 設定一個時間窗口&#xff0…

【前端文件下載實現:多種表格導出方案的技術解析】

前端文件下載實現:多種表格導出方案的技術解析 背景介紹 在企業級應用中,數據導出是一個常見需求,特別是表格數據的導出。在我們的管理系統中,不僅需要支持用戶數據的Excel導出,還需要處理多種格式的表格文件下載&am…