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í)打開,也可以單個(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-06
Android 中 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-06
Android應(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-03
Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

