BasicPage.dart 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import 'package:farmer_client/widgets/layout/bottomBar/BottomBar.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:get/get.dart';
  5. import 'barList.dart';
  6. abstract class BasicPage extends StatefulWidget {
  7. // 导航标题
  8. // 用法 naviTitle = xxxx
  9. final _title = Rx<String>("");
  10. set naviTitle(String t) {
  11. _title.value = t;
  12. }
  13. // 当前活动 tab
  14. // 如果非 tab 页, 则不传
  15. int? tabIndex;
  16. // 允许滚动 - 不是响应式的
  17. bool canScroll;
  18. //
  19. BasicPage({Key? key, this.canScroll = true, this.tabIndex }) : super(key: key);
  20. @protected
  21. Widget builder(BuildContext context);
  22. // 将要展示
  23. @protected
  24. @mustCallSuper
  25. void beforeShow() {
  26. assert(() {
  27. print("===========beforeShow===========");
  28. return true;
  29. }());
  30. }
  31. @protected
  32. @mustCallSuper
  33. void beforeHide() {
  34. assert(() {
  35. print("===========beforeHide===========");
  36. return true;
  37. }());
  38. }
  39. @protected
  40. @mustCallSuper
  41. void beforeUnmounted() {
  42. assert(() {
  43. print("===========beforeUnmounted===========");
  44. return true;
  45. }());
  46. }
  47. @override
  48. State<BasicPage> createState() => _BasicPageState();
  49. }
  50. class _BasicPageState extends State<BasicPage> {
  51. @override
  52. void initState() {
  53. super.initState();
  54. }
  55. @override
  56. void didChangeDependencies() {
  57. super.didChangeDependencies();
  58. widget.beforeShow();
  59. }
  60. @override
  61. void deactivate() {
  62. super.deactivate();
  63. widget.beforeHide();
  64. }
  65. @override
  66. void dispose() {
  67. super.dispose();
  68. widget.beforeUnmounted();
  69. }
  70. // appBar 的样式请查询 theme 文件
  71. PreferredSizeWidget? _getAppBar() {
  72. return AppBar(title: Obx(() => Text(widget._title.value)));
  73. }
  74. Widget _buildChild(BuildContext context) {
  75. if (widget.canScroll) {
  76. return SingleChildScrollView(
  77. child: widget.builder(context),
  78. );
  79. } else {
  80. return widget.builder(context);
  81. }
  82. }
  83. @override
  84. Widget build(BuildContext context) {
  85. return Scaffold(
  86. appBar: _getAppBar(),
  87. body: SafeArea(
  88. child: _buildChild(context),
  89. ),
  90. bottomNavigationBar: widget.tabIndex == null ? null : BottomBar(list: BarList, current: widget.tabIndex!),
  91. );
  92. }
  93. }