Flutter監(jiān)聽(tīng)當(dāng)前頁(yè)面可見(jiàn)與隱藏狀態(tài)的代碼詳解
flutter
可以監(jiān)聽(tīng)app
進(jìn)入前臺(tái)還是后臺(tái)狀態(tài),也可以監(jiān)聽(tīng)當(dāng)前某個(gè)頁(yè)面當(dāng)前正在顯示
還是隱藏了
。找一個(gè)公共文件初始化一下
路由觀察者
,例如:public.dart
,只要能做成全局對(duì)象就行。
/// 路由觀察者 final routeObserver = RouteObserver<PageRoute>();
有了 路由觀察者
對(duì)象后,注冊(cè)為導(dǎo)航監(jiān)聽(tīng)者:
main.dart
/// MaterialApp Widget buildMaterialApp(BuildContext context) { // 這里直接在 MaterialApp 對(duì)象進(jìn)行全局注冊(cè),其他模式也有,例如 CupertinoApp、WidgetsAp、Navigator return GetMaterialApp( title: 'Flutter Demo', // 注冊(cè) navigatorObservers: [routeObserver], ); ... ... ... } }
頁(yè)面使用,推薦封裝作為底層 BaseStateful
使用,其他頁(yè)面繼承,可以隨時(shí)打開(kāi),也可以單個(gè)頁(yè)面使用:
import 'package:flutter/material.dart'; import 'package:base_project/utils/public.dart'; @immutable class BaseStatefulController extends StatefulWidget { const BaseStatefulController({super.key}); @override State<BaseStatefulController> createState() => BaseStatefulControllerState(); } class BaseStatefulControllerState extends State<BaseStatefulController> with RouteAware { /// 啟用路由觀察者 bool enableRouteObserver = false; @override void initState() { super.initState(); // 等待加載 WidgetsBinding.instance.addPostFrameCallback((_) { // 初始化上下文完成 initStateContext(); }); } /// 初始化上下文完成,可以在這里做一些需要上下文的初始化操作 void initStateContext () { // 注冊(cè)路由監(jiān)聽(tīng) if (enableRouteObserver) { final route = ModalRoute.of(context); if (route is PageRoute) { routeObserver.subscribe(this, route); } } } @override void dispose() { // 取消路由監(jiān)聽(tīng) routeObserver.unsubscribe(this); super.dispose(); } @override void didPush() { print("頁(yè)面被 push 到棧頂,頁(yè)面可見(jiàn)"); } @override void didPop() { print("頁(yè)面被 pop,頁(yè)面銷毀"); } @override void didPushNext() { print("有新頁(yè)面 push 進(jìn)來(lái),當(dāng)前頁(yè)面進(jìn)入不可見(jiàn)狀態(tài)"); } @override void didPopNext() { print("上一個(gè)頁(yè)面被 pop,當(dāng)前頁(yè)面重新可見(jiàn)"); } @override Widget build(BuildContext context) { return Container(); } }
方法 | 作用 |
---|---|
subscribe(routeAware, route) | 訂閱某個(gè)頁(yè)面,監(jiān)聽(tīng)生命周期變化 |
unsubscribe(routeAware) | 取消訂閱,避免內(nèi)存泄漏 |
didPush() | 頁(yè)面進(jìn)入可見(jiàn) |
didPop() | 頁(yè)面銷毀 |
didPushNext() | 當(dāng)前頁(yè)面被覆蓋,不可見(jiàn) |
didPopNext() | 上一個(gè)頁(yè)面被 pop ,當(dāng)前頁(yè)面重新可見(jiàn) |
以上就是Flutter監(jiān)聽(tīng)當(dāng)前頁(yè)面可見(jiàn)與隱藏狀態(tài)的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter監(jiān)聽(tīng)當(dāng)前頁(yè)面的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
android客戶端從服務(wù)器端獲取json數(shù)據(jù)并解析的實(shí)現(xiàn)代碼
今天總結(jié)一下android客戶端從服務(wù)器端獲取json數(shù)據(jù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2013-06-06Android 中 android.view.WindowLeaked的解決辦法
這篇文章主要介紹了Android 中 android.view.WindowLeaked的解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05詳解Android 視頻播放時(shí)停止后臺(tái)運(yùn)行的方法
這篇文章主要介紹了詳解Android 視頻播放時(shí)停止后臺(tái)運(yùn)行的方法的相關(guān)資料,需要的朋友可以參考下2017-06-06Android應(yīng)用動(dòng)態(tài)修改主題的方法示例
今天小編就為大家分享一篇關(guān)于Android應(yīng)用動(dòng)態(tài)修改主題的方法示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02