215 lines
8.7 KiB
Dart
215 lines
8.7 KiB
Dart
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<MainPageController> {
|
|
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("/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<bool> _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; // 允许退出程序
|
|
}
|
|
}
|
|
}
|