// 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:get_storage/get_storage.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/common/selectDialog.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(), // EPage(sleepUri: "https://xiaoe.he-info.cn/"), // MessagePage(), // MinePage(), // ]; // DateTime? _lastBackPressedTime; // 记录上一次返回的时间 // final getStorage = GetStorage(); // @override // Widget build(BuildContext context) { // Future.delayed(const Duration(milliseconds: 0), () { // String? isShowYingShiDialog = getStorage.read("isShowYingShiDialog"); // if (isShowYingShiDialog == null || isShowYingShiDialog != "true") { // String btnName = "同意".tr; // String cancelName = "取消".tr; // if (Platform.isAndroid) { // cancelName = "退出".tr; // } // showCustomConfirmOfWebViewDialog(context, "隐私协议".tr, getPrivacy(1), // btnName: btnName, showCancel: true, cancelName: cancelName) // .then((e) { // if (e == "confirm") { // getStorage.write("isShowYingShiDialog", "true"); // } else { // if (cancelName == "退出") { // SystemNavigator.pop(); // } // } // }); // } // }); // return PopScope( // canPop: false, // // onPopInvokedWithResult: (disposition, result) async { // // if (Platform.isAndroid) { // // var flag = await _handleBackPressed(context); // 自定义返回逻辑 // // if (flag) { // // SystemNavigator.pop(); // // } // // } // // }, // onPopInvokedWithResult: (disposition, result) async { // UserInfoController userInfoController = Get.find(); // if (userInfoController.model.isProgrammaticPop) { // // 如果是程序触发,重置标记并忽略 // userInfoController.model.isProgrammaticPop = false; // return; // 阻止处理 // } // if (Platform.isAndroid) { // // var flag = await _handleBackPressed(context); // 自定义返回逻辑 // // if (flag) { // // SystemNavigator.pop(); // // } // Get.back(); // } // }, // child: Obx( // () { // if (globalController.model.hideBottomNavigationBar == true) { // return Scaffold( // // body: arr[controller.model.currentIndex], // body: IndexedStack( // // ✅ 改成 IndexedStack // index: controller.model.currentIndex, // children: // arr.map((page) => SizedBox.expand(child: page)).toList(), // ), // 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], // body: IndexedStack( // // ✅ 改成 IndexedStack // index: controller.model.currentIndex??3, // children: arr // .map((page) => SizedBox.expand(child: page)) // .toList(), // ), // 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) { // if ((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("/otherLoginPage"); // }); // }); // 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; // 允许退出程序 // } // } // } 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:get_storage/get_storage.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/setting/language/language_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/APPPackageType.dart'; import 'package:vbvs_app/enum/LoginStatus.dart'; import 'package:vbvs_app/pages/common/selectDialog.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(); final getStorage = GetStorage(); late final List arr; late final List bottomItems; DateTime? _lastBackPressedTime; LanguageController languageController = Get.find(); MainPageBottomChange({super.key}) { // ✅ 根据是否测试账号动态生成页面 if (!AppConstants.is_test_account) { arr = [ HomePage(), EPage(sleepUri: "https://xiaoe.he-info.cn/"), MessagePage(), MinePage(), ]; bottomItems = [ 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: true), getBottomNavigationBarItem("assets/img/menu/mine.svg", "assets/img/menu/n_mine.svg", "菜单.我的".tr), ]; } else { arr = [ HomePage(), MessagePage(), MinePage(), ]; bottomItems = [ getBottomNavigationBarItem("assets/img/menu/home.svg", "assets/img/menu/n_home.svg", "菜单.首页".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), ]; } } 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 Obx(() { int type1 = messageController.model.body_message_read!; int type2 = messageController.model.system_message_read!; return Padding( padding: EdgeInsets.only(bottom: 6.rpx), child: isEmpty ? Container() : Stack( clipBehavior: Clip.none, children: [ SvgPicture.asset( path, width: size, height: size, ), if ((type1 == 1 || type2 == 1) && showBadge) Positioned( right: -20.rpx, top: -2.rpx, child: Container( width: 14.rpx, height: 14.rpx, decoration: const BoxDecoration( color: Colors.red, shape: BoxShape.circle, ), ), ), ], ), ); }); } return BottomNavigationBarItem( icon: buildIcon(actSvgPath), activeIcon: buildIcon(svgPath), label: label, ); } @override Widget build(BuildContext context) { if (AppConstants().ent_type == APPPackageType.TH.code) { Future.delayed(const Duration(milliseconds: 0), () { String? isShowYingShiDialog = getStorage.read("isShowYingShiDialog"); if (isShowYingShiDialog == null || isShowYingShiDialog != "true") { String btnName = "同意".tr; String cancelName = "取消".tr; if (Platform.isAndroid) cancelName = "退出".tr; showCustomConfirmOfWebViewDialog(context, "隐私协议".tr, getPrivacy(1), btnName: btnName, showCancel: true, cancelName: cancelName) .then((e) { if (e == "confirm") { getStorage.write("isShowYingShiDialog", "true"); } else { if (cancelName == "退出") SystemNavigator.pop(); } }); } }); } return Obx(() { final currentLanguage = languageController.selectLanguage.value; // 监听此变量变化 return PopScope( canPop: false, onPopInvokedWithResult: (disposition, result) async { UserInfoController userInfoController = Get.find(); if (userInfoController.model.isProgrammaticPop) { userInfoController.model.isProgrammaticPop = false; return; } // if (Platform.isAndroid) { // Get.back(); // } if (Platform.isAndroid) { var flag = await _handleBackPressed(context); if (flag) { SystemNavigator.pop(); } } }, child: Obx(() { int currentIndex = controller.model.currentIndex; // ✅ 防止 index 超出范围(例如测试账号少一个 tab) if (currentIndex >= arr.length) { currentIndex = 0; controller.model.currentIndex = 0; } if (globalController.model.hideBottomNavigationBar == true) { return Scaffold( body: IndexedStack( index: currentIndex, children: arr.map((page) => SizedBox.expand(child: page)).toList(), ), ); } else { return Container( decoration: const BoxDecoration( image: DecorationImage( image: AssetImage('assets/img/bgImage.png'), fit: BoxFit.fill, ), ), child: Scaffold( backgroundColor: Colors.transparent, body: IndexedStack( index: currentIndex, children: arr.map((page) => SizedBox.expand(child: page)).toList(), ), 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: currentIndex, onTap: (index) { Future.delayed(const Duration(milliseconds: 100), () { UserInfoController userInfoController = Get.find(); bool isLoggedIn = userInfoController.model.login == LoginStatus.LOGIN.code; // ✅ 仅非测试账号检查登录状态 if (!AppConstants.is_test_account && (index == 2) && !isLoggedIn) { TopSlideNotification.show( context, text: "必须登录提示".tr, textColor: themeController.currentColor.sc9, ); Future.delayed(const Duration(milliseconds: 50), () { if (Get.currentRoute == '/ePage' || Get.currentRoute == '/messagePage') { Get.back(); } Future.delayed(const Duration(milliseconds: 100), () { Get.toNamed("/otherLoginPage"); }); }); return; } if (controller.model.currentIndex != index) { globalController.model.hideBottomNavigationBar = false; globalController.updateAll(); } controller.model.currentIndex = index; controller.updateAll(); }); }, items: bottomItems, ), ), ), ), ); } }), ); }); } Future _handleBackPressed(BuildContext context) async { final currentTime = DateTime.now(); if (_lastBackPressedTime == null || currentTime.difference(_lastBackPressedTime!) > const Duration(seconds: 2)) { _lastBackPressedTime = currentTime; TopSlideNotification.show(context, text: "滑动退出提醒".tr); return false; } else { return true; } } }