main_page.dart 2.9 KB

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