前言 最近群里遇到獲取Route名為空的問題,當時沒在意。。。 直到自己在監控頁面啟動耗時,需要確定當前頁面是哪個從而方便標記它載入的耗時時,遇到同樣 route.settings.name 為空問題,模擬場景如下: 在 main.dart 頁面中點擊 + 按鈕跳轉到 TestPage2 頁面。 M ...
前言
最近群里遇到獲取Route名為空的問題,當時沒在意。。。
直到自己在監控頁面啟動耗時,需要確定當前頁面是哪個從而方便標記它載入的耗時時,遇到同樣 route.settings.name 為空問題,模擬場景如下:
- 在 main.dart 頁面中點擊 + 按鈕跳轉到 TestPage2 頁面。
- MaterialApp 中設置路由守衛併在路由守衛中列印 route 名。
main.dart
launch_observer.dart
TestPage2.dart
路由守衛中列印結果如下:
可以看出
- 應用啟動進入 main 列印是正確的,之前沒有頁面,進入時候列印 route = /
- 進入 TestPage2 時,previewousRoute 的 name = / 正確,但是當前 route 的 settings.name 卻為 null ,這就比較奇怪了。
我試著復現文章開頭的例子,代碼如下:
- main.dart 不變,點擊 + 跳轉到 TestPage2
- 在 TestPage2 中獲取路由參數和路由名字
MaterialPageRoute 繼承關係
最終我們要得到的 name 其實是 Route 內部的 RouteSettings 對象的 name。
而通過繼承關係追溯,最終 Route 中的 RouteSettings② 由 MaterialPageRoute① 傳過來。
解決辦法
很簡單,在跳轉頁面之前給 MaterialPageRoute 設置 settings 屬性。
這樣就可以接受到 name 和傳遞過去參數了,如圖:
能不能自動設置 RouteSettings
答案: 拿不到。
思路一:
有這個想法是因為涉及到老代碼的遷移,很多老代碼不想一個個改加 Settings,偷個懶。而且平時用的時候大部分情況下都不會帶 settings 屬性。
當然跟我有同樣想法的人也有 flutter - How to get the Widget Class name from the builder object in MaterialPageRoute - Stack Overflow
嘗試如下:
PS: 哪位大佬有更好解決自動添加 RouteSetting 屬性辦法希望不吝賜教,多謝。
換個思路
群里大佬指出可以嘗試換個思路: aop buildpage。這裡找到個帖子是這種思路,沒驗證各位大大可自行辨別,哈哈。
Flutter aspectd(五)全局監控 flutter 生命周期
核心點
當我們要打開一個新的 flutter 頁面會執行 Navigator.pushNamed(context, RouteHelper.firstPage),最終會執行 navigator.dart 中的 handlePush 方法,hook 該方法,從該方法中可以得到我們要啟動頁面的 Route,以及當前的頁面 Route。
總結
- Route.settings.name 無法獲取原因是 push/pushNamed 時 MaterialPageRoute 沒設置 RouteSettings 屬性。
- 如果老項目有埋點等需求需要監控頁面名,建議老老實實給每個 MaterialPageRoute 加 RouteSettings 屬性比較穩妥。
- 最最推薦的做法是通過 APT 方式模塊化路由功能,這樣應用中所有 MaterialPageRoute 生成過程就可以收攏,生成代碼時將 RouteSettings 屬性添加上即可。
如果覺得文章對你有幫助,點贊、收藏、關註、評論,一鍵四連支持,你的支持就是我創作最大的動力。
❤️ 本文原創聽蟬 公眾號:碼里特別有禪 歡迎關註原創技術文章第一時間推送 ❤️
PS: 文中所有源碼獲取方式:公眾號後臺回覆 “route”
參考鏈接
flutter - How to get the Widget Class name from the builder object in MaterialPageRoute - Stack Overflow
Flutter aspectd(五)全局監控flutter生命周期 - 掘金