main_page.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import 'package:get/get.dart';
  4. import 'package:keyboard/widget/delegate_lifecycle_widget.dart';
  5. import 'package:lottie/lottie.dart';
  6. import '../../base/base_page.dart';
  7. import '../../di/get_it.dart';
  8. import '../../resource/assets.gen.dart';
  9. import '../../router/app_pages.dart';
  10. import 'main_controller.dart';
  11. class MainPage extends BasePage<MainController> {
  12. MainPage({super.key}) {
  13. // 修复从键盘,跳转到app页面后,Tab卡死点不动
  14. Get.lazyPut(() => getIt.get<MainController>());
  15. }
  16. static start({Map<String, String>? arguments}) {
  17. if (Get.isRegistered<MainController>()) {
  18. var controller = Get.find<MainController>();
  19. controller.handleJumpParameters(parameters: arguments);
  20. Get.until((route) => route.settings.name == RoutePath.mainTab);
  21. } else {
  22. return Get.offAllNamed(RoutePath.mainTab, parameters: arguments);
  23. }
  24. }
  25. @override
  26. bool immersive() => true;
  27. @override
  28. Widget buildBody(BuildContext context) {
  29. return PopScope(
  30. child: Scaffold(
  31. bottomNavigationBar: buildBottomAppBar(),
  32. drawerEdgeDragWidth: 0,
  33. body: DelegateLifecycleWidget(
  34. onCreateCallback: () {
  35. // 处理跳转参数
  36. controller.handleJumpParameters();
  37. },
  38. child: Obx(() => IndexedStack(
  39. index: controller.currentIndex,
  40. children: controller.tabBeans.map((e) => e.page()).toList(),
  41. ))
  42. ),
  43. ),
  44. );
  45. }
  46. Widget buildBottomAppBar() {
  47. return Container(
  48. decoration: BoxDecoration(color: Colors.white),
  49. child: BottomAppBar(
  50. color: Colors.white,
  51. height: 56.h,
  52. padding: EdgeInsets.zero,
  53. child: Row(
  54. mainAxisAlignment: MainAxisAlignment.spaceAround,
  55. children: List.generate(controller.tabBeans.length, bottomAppBarItem),
  56. ),
  57. ),
  58. );
  59. }
  60. Widget bottomAppBarItem(int index) {
  61. return Expanded(
  62. child: GestureDetector(
  63. onTap: () => controller.changeIndex(index),
  64. behavior: HitTestBehavior.opaque,
  65. child: Column(
  66. mainAxisAlignment: MainAxisAlignment.center,
  67. children: [
  68. Obx(() {
  69. TabBean tabBean = controller.tabBeans[index];
  70. bool isSelected = controller.currentIndex == index;
  71. return Column(
  72. children: [
  73. isSelected
  74. ? Lottie.asset(
  75. tabBean.selectedIcon,
  76. repeat: false,
  77. width: 28.w,
  78. height: 28.w,
  79. )
  80. : Image.asset(
  81. tabBean.normalIcon,
  82. width: 28.w,
  83. height: 28.w,
  84. ),
  85. Text(
  86. tabBean.title,
  87. style: TextStyle(
  88. fontSize: 10.sp,
  89. fontWeight: FontWeight.w400,
  90. color:
  91. isSelected
  92. ? const Color(0xFF7D46FC)
  93. : Colors.black.withValues(alpha: 0.4),
  94. ),
  95. ),
  96. ],
  97. );
  98. }),
  99. ],
  100. ),
  101. ),
  102. );
  103. }
  104. }