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 extends BaseState 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; } } }