main_page.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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, dynamic>? arguments}) {
  17. return Get.offAllNamed(RoutePath.mainTab, arguments: arguments);
  18. }
  19. @override
  20. bool immersive() => true;
  21. @override
  22. Widget buildBody(BuildContext context) {
  23. return PopScope(
  24. child: Scaffold(
  25. bottomNavigationBar: buildBottomAppBar(),
  26. drawerEdgeDragWidth: 0,
  27. body: DelegateLifecycleWidget(
  28. onCreateCallback: () {
  29. // 处理跳转参数
  30. controller.handleJumpParameters();
  31. },
  32. child: Obx(() => controller.tabBeans[controller.currentIndex].page),
  33. ),
  34. ),
  35. );
  36. }
  37. Widget buildBottomAppBar() {
  38. return Container(
  39. decoration: BoxDecoration(color: Colors.white),
  40. child: BottomAppBar(
  41. color: Colors.white,
  42. height: 56.h,
  43. padding: EdgeInsets.zero,
  44. child: Row(
  45. mainAxisAlignment: MainAxisAlignment.spaceAround,
  46. children: List.generate(controller.tabBeans.length, bottomAppBarItem),
  47. ),
  48. ),
  49. );
  50. }
  51. Widget bottomAppBarItem(int index) {
  52. return Expanded(
  53. child: GestureDetector(
  54. onTap: () => controller.changeIndex(index),
  55. behavior: HitTestBehavior.opaque,
  56. child: Column(
  57. mainAxisAlignment: MainAxisAlignment.center,
  58. children: [
  59. Obx(() {
  60. TabBean tabBean = controller.tabBeans[index];
  61. bool isSelected = controller.currentIndex == index;
  62. return Column(
  63. children: [
  64. isSelected
  65. ? Lottie.asset(
  66. tabBean.selectedIcon,
  67. repeat: false,
  68. width: 28.w,
  69. height: 28.w,
  70. )
  71. : Image.asset(
  72. tabBean.normalIcon,
  73. width: 28.w,
  74. height: 28.w,
  75. ),
  76. Text(
  77. tabBean.title,
  78. style: TextStyle(
  79. fontSize: 10.sp,
  80. fontWeight: FontWeight.w400,
  81. color:
  82. isSelected
  83. ? const Color(0xFF7D46FC)
  84. : Colors.black.withValues(alpha: 0.4),
  85. ),
  86. ),
  87. ],
  88. );
  89. }),
  90. ],
  91. ),
  92. ),
  93. );
  94. }
  95. }