base_lifecycle_state.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/services.dart';
  3. import 'package:lszlgl/base/base_state.dart';
  4. export 'package:lszlgl/config/pics.dart';
  5. export 'package:lszlgl/router/my_navigator.dart';
  6. export 'package:lszlgl/router/my_router.dart';
  7. export 'package:lszlgl/ext/value_notifier_ext.dart';
  8. /// 页面生命周期基类
  9. ///
  10. /// A->B页面跳转流程:
  11. /// * A -> onInit
  12. /// * A -> onFirstShow
  13. /// * A页面 跳转 B页面
  14. /// * A -> onHide
  15. /// * B -> onInit
  16. /// * B -> onFirstShow
  17. /// * 关闭B页面
  18. /// * A -> onShow
  19. /// * B -> onHide
  20. /// * B -> onDestroy
  21. ///
  22. /// App前后台切换流程:
  23. /// * A -> onInit
  24. /// * A -> onFirstShow
  25. /// * 退入后台
  26. /// * A -> onBackstage
  27. /// * 回到前台
  28. /// * A -> onAppBackToFront
  29. ///
  30. /// 常用Api
  31. /// * [onInit] 页面初始化, 未绘制页面
  32. /// * [onFirstShow] 页面首次显示, 已绘制完成
  33. /// * [onShow] 页面显示, 路由切换
  34. /// * [onHide] 页面隐藏, 路由切换
  35. /// * [onDestroy] 页面销毁
  36. /// * [onAppBackstage] App进入后台
  37. /// * [onAppBackToFront] App回到前台
  38. abstract class BaseLifecycleState<T extends StatefulWidget> extends BaseState<T> with RouteAware, WidgetsBindingObserver {
  39. /// 展示页面参数
  40. Object? get showPageArgs => MyNavigator.routeInfo.showArguments;
  41. /// 隐藏页面参数
  42. Object? get hiddenPageArgs => MyNavigator.routeInfo.hideArguments;
  43. /// 前一个路由是否是一个 Page
  44. bool get previousRouteIsPage => MyNavigator.navigatorObs.routeInfo.isPage;
  45. /// 页面是否在前台显示
  46. bool isShow = false;
  47. /// 页面是否在路由栈顶
  48. bool get isFirstPage => MyNavigator.navigatorObs.routeInfo.showName == ModalRoute.of(context)!.settings.name;
  49. /// app在后台
  50. bool appPause = false;
  51. /// ************** 生命周期 **************
  52. /// 初始化
  53. void onInit() {}
  54. /// 页面首次显示
  55. void onFirstShow(Duration timeStamp) {}
  56. /// 页面显示
  57. void onShow() {}
  58. /// 页面隐藏
  59. void onHide() {}
  60. /// 页面销毁
  61. void onDestroy() {}
  62. /// App进入后台
  63. void onAppBackstage() {}
  64. /// App 回到前台
  65. void onAppBackToFront() {}
  66. /// 不建议重写此函数, 请使用[onInit]初始化页面
  67. @override
  68. void initState() {
  69. // APP生命周期监听
  70. WidgetsBinding.instance.addObserver(this);
  71. // 绘制完成监听
  72. ServicesBinding.instance.addPostFrameCallback((timeStamp) {
  73. // 路由监听
  74. if (ModalRoute.of(context) != null) {
  75. MyNavigator.routeObs.subscribe(this, ModalRoute.of(context)!);
  76. }
  77. debugPrint('onFistShow: $runtimeType');
  78. onFirstShow(timeStamp);
  79. isShow = true;
  80. });
  81. debugPrint('onInit: $runtimeType');
  82. onInit();
  83. super.initState();
  84. }
  85. /// 不要重写此函数, 请使用[onDestroy]处理页面销毁
  86. @override
  87. void dispose() {
  88. // replace路由时需要在销毁时调用onHide生命周期
  89. if (isShow) {
  90. isShow = false;
  91. debugPrint('onHide: $runtimeType');
  92. onHide();
  93. }
  94. MyNavigator.routeObs.unsubscribe(this);
  95. WidgetsBinding.instance.removeObserver(this);
  96. debugPrint('onDestroy: $runtimeType');
  97. onDestroy();
  98. super.dispose();
  99. }
  100. /// 路由到本页
  101. /// 请使用[onFirstShow]处理页面首次显示逻辑
  102. @override
  103. void didPush() {
  104. // debugPrint('didPush: $runtimeType');
  105. }
  106. /// 路由到下一个页面
  107. /// 不要重写此函数
  108. /// 请使用[onHide]处理页面隐藏逻辑
  109. @override
  110. void didPushNext() {
  111. isShow = false;
  112. debugPrint('onHide: $runtimeType');
  113. onHide();
  114. }
  115. /// 弹出本页
  116. /// 不要重写此函数
  117. /// 请使用[onHide]处理页面隐藏逻辑
  118. @override
  119. void didPop() {
  120. isShow = false;
  121. debugPrint('onHide: $runtimeType');
  122. onHide();
  123. super.didPushNext();
  124. }
  125. /// 已回到当前页(注意:不建议直接使用此函数),可使用 [onShow] 方法
  126. @override
  127. void didPopNext() {
  128. isShow = true;
  129. debugPrint('onShow: $runtimeType');
  130. onShow();
  131. }
  132. /// App 生命周期监听(注意:不建议直接使用此函数)
  133. ///
  134. /// 请使用 onAppBackstage/onAppBackToFront 等生命周期 API
  135. @override
  136. void didChangeAppLifecycleState(AppLifecycleState state) {
  137. switch (state) {
  138. case AppLifecycleState.resumed: // App 可见
  139. if (appPause) {
  140. debugPrint('onAppBackToFront: $runtimeType');
  141. appPause = false;
  142. onAppBackToFront();
  143. }
  144. break;
  145. case AppLifecycleState.inactive: // App 可见但失去焦点
  146. break;
  147. case AppLifecycleState.hidden: // App 不可见
  148. break;
  149. case AppLifecycleState.paused: // App 在后台暂停运行
  150. debugPrint('onBackstage: $runtimeType');
  151. appPause = true;
  152. onAppBackstage();
  153. break;
  154. case AppLifecycleState.detached: // App 销毁
  155. break;
  156. }
  157. }
  158. }