import 'dart:async'; import 'dart:io'; import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; import 'package:vbvs_app/controller/main_bottom/main_page_controller.dart'; import 'package:vbvs_app/controller/message/message_controller.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/enum/LoginStatus.dart'; import 'package:vbvs_app/pages/main_bottom/e_page.dart'; import 'package:vbvs_app/pages/main_bottom/home_page.dart'; import 'package:vbvs_app/pages/main_bottom/message_page.dart'; import 'package:vbvs_app/pages/main_bottom/mine_page.dart'; class MainPageBottomChange extends GetView { GlobalController globalController = Get.find(); ThemeController themeController = Get.find(); MessageController messageController = Get.find(); getBottomNavigationBarItem(String svgPath, String actSvgPath, String label, {double size = 0, bool isEmpty = false, bool showBadge = false}) { if (size == 0) { size = 36.rpx; } Widget buildIcon(String path) { return Padding( padding: EdgeInsets.only(bottom: 6.rpx), child: isEmpty ? Container() : Stack( clipBehavior: Clip.none, children: [ SvgPicture.asset( path, width: size, height: size, ), if (showBadge) Positioned( right: -20.rpx, top: -2.rpx, child: Container( width: 14.rpx, height: 14.rpx, decoration: BoxDecoration( color: Colors.red, shape: BoxShape.circle, ), ), ) ], ), ); } return BottomNavigationBarItem( icon: buildIcon(actSvgPath), activeIcon: buildIcon(svgPath), label: label, ); } List arr = [ HomePage(), // SleepReportPage(), EPage(), MessagePage(), MinePage(), ]; DateTime? _lastBackPressedTime; // 记录上一次返回的时间 @override Widget build(BuildContext context) { return PopScope( canPop: false, onPopInvokedWithResult: (disposition, result) async { if (Platform.isAndroid) { var flag = await _handleBackPressed(context); // 自定义返回逻辑 if (flag) { SystemNavigator.pop(); } } }, child: Obx( () { if (globalController.model.hideBottomNavigationBar == true) { return Scaffold( body: arr[controller.model.currentIndex], floatingActionButtonAnimator: FloatingActionButtonAnimator.noAnimation, floatingActionButton: Container(), ); } else { return Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/img/bgImage.png'), // 本地图片 fit: BoxFit.fill, // 填满整个 Container ), ), child: Scaffold( backgroundColor: Colors.transparent, body: arr[controller.model.currentIndex], floatingActionButtonAnimator: FloatingActionButtonAnimator.noAnimation, floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: Theme( data: Theme.of(context).copyWith( splashFactory: NoSplash.splashFactory, splashColor: Colors.transparent, highlightColor: Colors.transparent, ), child: Container( decoration: BoxDecoration( border: Border( top: BorderSide( color: themeController.currentColor.sc4 .withOpacity(0.5), width: AppConstants().border_width, ), ), ), child: BottomNavigationBar( unselectedItemColor: themeController.currentColor.sc4, selectedItemColor: themeController.currentColor.sc1, backgroundColor: themeController.currentColor.sc5, selectedFontSize: 26.rpx, unselectedFontSize: 26.rpx, type: BottomNavigationBarType.fixed, currentIndex: controller.model.currentIndex, onTap: (index) { Future.delayed(const Duration(milliseconds: 100), () { UserInfoController userInfoController = Get.find(); bool isLoggedIn = userInfoController.model.login == LoginStatus.LOGIN.code; if ((index == 1 || index == 2) && !isLoggedIn) { TopSlideNotification.show( context, text: "必须登录提示".tr, textColor: themeController.currentColor.sc9, ); Future.delayed(Duration(milliseconds: 50), () { if (Get.currentRoute == '/ePage' || Get.currentRoute == '/messagePage') { Get.back(); } Future.delayed(Duration(milliseconds: 100), () { Get.toNamed("/loginPage"); }); }); return; } if (controller.model.currentIndex != index) { globalController.model.hideBottomNavigationBar = false; globalController.updateAll(); } controller.model.currentIndex = index; controller.updateAll(); }); }, items: [ getBottomNavigationBarItem("assets/img/menu/home.svg", "assets/img/menu/n_home.svg", "菜单.首页".tr), getBottomNavigationBarItem("assets/img/menu/e.svg", "assets/img/menu/n_e.svg", "菜单.小e".tr), getBottomNavigationBarItem( "assets/img/menu/message.svg", "assets/img/menu/n_message.svg", "菜单.消息".tr, showBadge: (messageController .model.body_message_read == 1 || messageController.model.system_message_read == 1)), getBottomNavigationBarItem("assets/img/menu/mine.svg", "assets/img/menu/n_mine.svg", "菜单.我的".tr), ], ), ), ), )); } }, ), ); } Future _handleBackPressed(BuildContext context) async { final currentTime = DateTime.now(); // 如果上次点击返回键时间为空,或者间隔超过 1 秒 if (_lastBackPressedTime == null || currentTime.difference(_lastBackPressedTime!) > Duration(seconds: 2)) { _lastBackPressedTime = currentTime; // showToast("再按一次退出程序", color: color_warning, closeTime: 2); TopSlideNotification.show(context, text: "滑动退出提醒".tr); return false; // 阻止退出程序 } else { return true; // 允许退出程序 } } }