123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:lszlgl/base/base_state.dart';
- export 'package:lszlgl/config/pics.dart';
- export 'package:lszlgl/router/my_navigator.dart';
- export 'package:lszlgl/router/my_router.dart';
- export 'package:lszlgl/ext/value_notifier_ext.dart';
- /// 页面生命周期基类
- ///
- /// A->B页面跳转流程:
- /// * A -> onInit
- /// * A -> onFirstShow
- /// * A页面 跳转 B页面
- /// * A -> onHide
- /// * B -> onInit
- /// * B -> onFirstShow
- /// * 关闭B页面
- /// * A -> onShow
- /// * B -> onHide
- /// * B -> onDestroy
- ///
- /// App前后台切换流程:
- /// * A -> onInit
- /// * A -> onFirstShow
- /// * 退入后台
- /// * A -> onBackstage
- /// * 回到前台
- /// * A -> onAppBackToFront
- ///
- /// 常用Api
- /// * [onInit] 页面初始化, 未绘制页面
- /// * [onFirstShow] 页面首次显示, 已绘制完成
- /// * [onShow] 页面显示, 路由切换
- /// * [onHide] 页面隐藏, 路由切换
- /// * [onDestroy] 页面销毁
- /// * [onAppBackstage] App进入后台
- /// * [onAppBackToFront] App回到前台
- abstract class BaseLifecycleState<T extends StatefulWidget> extends BaseState<T> with RouteAware, WidgetsBindingObserver {
- /// 展示页面参数
- Object? get showPageArgs => MyNavigator.routeInfo.showArguments;
- /// 隐藏页面参数
- Object? get hiddenPageArgs => MyNavigator.routeInfo.hideArguments;
- /// 前一个路由是否是一个 Page
- bool get previousRouteIsPage => MyNavigator.navigatorObs.routeInfo.isPage;
- /// 页面是否在前台显示
- bool isShow = false;
- /// 页面是否在路由栈顶
- bool get isFirstPage => MyNavigator.navigatorObs.routeInfo.showName == ModalRoute.of(context)!.settings.name;
- /// app在后台
- bool appPause = false;
- /// ************** 生命周期 **************
- /// 初始化
- void onInit() {}
- /// 页面首次显示
- void onFirstShow(Duration timeStamp) {}
- /// 页面显示
- void onShow() {}
- /// 页面隐藏
- void onHide() {}
- /// 页面销毁
- void onDestroy() {}
- /// App进入后台
- void onAppBackstage() {}
- /// App 回到前台
- void onAppBackToFront() {}
- /// 不建议重写此函数, 请使用[onInit]初始化页面
- @override
- void initState() {
- // APP生命周期监听
- WidgetsBinding.instance.addObserver(this);
- // 绘制完成监听
- ServicesBinding.instance.addPostFrameCallback((timeStamp) {
- // 路由监听
- if (ModalRoute.of(context) != null) {
- MyNavigator.routeObs.subscribe(this, ModalRoute.of(context)!);
- }
- debugPrint('onFistShow: $runtimeType');
- onFirstShow(timeStamp);
- isShow = true;
- });
- debugPrint('onInit: $runtimeType');
- onInit();
- super.initState();
- }
- /// 不要重写此函数, 请使用[onDestroy]处理页面销毁
- @override
- void dispose() {
- // replace路由时需要在销毁时调用onHide生命周期
- if (isShow) {
- isShow = false;
- debugPrint('onHide: $runtimeType');
- onHide();
- }
- MyNavigator.routeObs.unsubscribe(this);
- WidgetsBinding.instance.removeObserver(this);
- debugPrint('onDestroy: $runtimeType');
- onDestroy();
- super.dispose();
- }
- /// 路由到本页
- /// 请使用[onFirstShow]处理页面首次显示逻辑
- @override
- void didPush() {
- // debugPrint('didPush: $runtimeType');
- }
- /// 路由到下一个页面
- /// 不要重写此函数
- /// 请使用[onHide]处理页面隐藏逻辑
- @override
- void didPushNext() {
- isShow = false;
- debugPrint('onHide: $runtimeType');
- onHide();
- }
- /// 弹出本页
- /// 不要重写此函数
- /// 请使用[onHide]处理页面隐藏逻辑
- @override
- void didPop() {
- isShow = false;
- debugPrint('onHide: $runtimeType');
- onHide();
- super.didPushNext();
- }
- /// 已回到当前页(注意:不建议直接使用此函数),可使用 [onShow] 方法
- @override
- void didPopNext() {
- isShow = true;
- debugPrint('onShow: $runtimeType');
- onShow();
- }
- /// App 生命周期监听(注意:不建议直接使用此函数)
- ///
- /// 请使用 onAppBackstage/onAppBackToFront 等生命周期 API
- @override
- void didChangeAppLifecycleState(AppLifecycleState state) {
- switch (state) {
- case AppLifecycleState.resumed: // App 可见
- if (appPause) {
- debugPrint('onAppBackToFront: $runtimeType');
- appPause = false;
- onAppBackToFront();
- }
- break;
- case AppLifecycleState.inactive: // App 可见但失去焦点
- break;
- case AppLifecycleState.hidden: // App 不可见
- break;
- case AppLifecycleState.paused: // App 在后台暂停运行
- debugPrint('onBackstage: $runtimeType');
- appPause = true;
- onAppBackstage();
- break;
- case AppLifecycleState.detached: // App 销毁
- break;
- }
- }
- }
|