import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/pages/message/message_page.dart'; import 'package:dating_touchme_app/pages/mine/mine_page.dart'; import 'package:dating_touchme_app/rtc/rtm_manager.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:dating_touchme_app/controller/mine/user_controller.dart'; import 'package:dating_touchme_app/controller/message/conversation_controller.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; import '../../extension/router_service.dart'; import '../../widget/double_tap_to_exit_widget.dart'; import '../discover/discover_page.dart'; import '../home/home_page.dart'; // 移除未使用的导入 class MainPage extends StatefulWidget { const MainPage({super.key}); @override State createState() => _MainPageState(); } class _MainPageState extends State { final storage = GetStorage(); PageController pageController = PageController(initialPage: 0); int currentIndex = 0; // 使用普通int替代RxInt // 将页面实例存储为成员变量,避免每次build都重新创建 late HomePage homePage; late DiscoverPage discoverPage; late MessagePage messagePage; late MinePage minePage; @override void initState() { super.initState(); // 初始化页面实例 homePage = HomePage(); discoverPage = DiscoverPage(); messagePage = MessagePage(); minePage = MinePage(); // 初始化UserController并调用获取环信用户token的方法 final userController = Get.put(UserController()); userController.getHxUserToken(); Get.put(RouteGuardService()); // 检查token并调用获取婚姻信息详情的方法 checkTokenAndFetchMarriageInfo(); initRTM(); } // 检查token并获取婚姻信息详情 Future checkTokenAndFetchMarriageInfo() async { // 调用userController中的getMarriageInformationDetail方法 final userController = Get.find(); final userId = storage.read('userId'); if(userId != null && userId.isNotEmpty){ await userController.getBaseUserInfo(userId, true); } } initRTM() async { String? userId = storage.read('userId'); await RTMManager.instance.initialize(appId: '4c2ea9dcb4c5440593a418df0fdd512d', userId: userId ?? ''); } @override Widget build(BuildContext context) { return DoubleTapToExitWidget( child: Scaffold( backgroundColor: Colors.transparent, resizeToAvoidBottomInset: false, body: PageView( physics: const NeverScrollableScrollPhysics(), controller: pageController, children: [ homePage, // 使用成员变量引用 discoverPage, messagePage, minePage, ], ), bottomNavigationBar: _buildBottomNavigationBar(), ), ); } /// 构建底部导航栏 Widget _buildBottomNavigationBar() { // 确保 ConversationController 已注册(如果未注册则注册一个,避免 Obx 中的错误) if (!Get.isRegistered()) { Get.put(ConversationController(), permanent: false); } return Obx(() { // 在 Obx 内部直接访问 observable,不使用条件判断,确保 GetX 能够追踪变化 final controller = Get.find(); final unreadCount = controller.totalUnreadCount.value; return TDBottomTabBar( currentIndex: currentIndex, TDBottomTabBarBasicType.iconText, componentType: TDBottomTabBarComponentType.normal, useVerticalDivider: false, navigationTabs: [ tabItem('首页', Assets.imagesHomePre, Assets.imagesHomeNol, 0), tabItem('找对象', Assets.imagesDiscoverPre, Assets.imagesDiscoverNol, 1), tabItemWithBadge('消息', Assets.imagesMessagePre, Assets.imagesMessageNol, 2, unreadCount), tabItem('我的', Assets.imagesMinePre, Assets.imagesMineNol, 3), ] ); }); } /// 底部导航栏item TDBottomTabBarTabConfig tabItem(String title, String selectedIcon, String unselectedIcon, int index) { return TDBottomTabBarTabConfig( tabText: title, selectedIcon: Image.asset(selectedIcon, width: 25, height: 25, fit: BoxFit.cover), unselectedIcon: Image.asset(unselectedIcon, width: 25, height: 25, fit: BoxFit.cover), selectTabTextStyle: TextStyle(color: Color(0xFFED4AC3)), unselectTabTextStyle: TextStyle(color: Color(0xFF999999)), onTap: () { currentIndex = index; pageController.jumpToPage(index); }, ); } /// 底部导航栏item(带未读数红点) TDBottomTabBarTabConfig tabItemWithBadge(String title, String selectedIcon, String unselectedIcon, int index, int unreadCount) { // 构建带未读数红点的图标 Widget buildIconWithBadge(String iconPath, bool isSelected) { return Stack( clipBehavior: Clip.none, children: [ Image.asset(iconPath, width: 25, height: 25, fit: BoxFit.cover), if (unreadCount > 0) Positioned( right: -6.w, top: -6.w, child: Container( padding: EdgeInsets.symmetric(horizontal: unreadCount > 99 ? 4.w : 5.w, vertical: 2.w), decoration: BoxDecoration( color: Color(0xFFFF3B30), borderRadius: BorderRadius.circular(10.w), border: Border.all(color: Colors.white, width: 1.w), ), constraints: BoxConstraints( minWidth: 16.w, minHeight: 16.w, ), child: Center( child: Text( unreadCount > 99 ? '99+' : unreadCount.toString(), style: TextStyle( color: Colors.white, fontSize: 10.sp, fontWeight: FontWeight.w500, ), textAlign: TextAlign.center, ), ), ), ), ], ); } return TDBottomTabBarTabConfig( tabText: title, selectedIcon: buildIconWithBadge(selectedIcon, true), unselectedIcon: buildIconWithBadge(unselectedIcon, false), selectTabTextStyle: TextStyle(color: Color(0xFFED4AC3)), unselectTabTextStyle: TextStyle(color: Color(0xFF999999)), onTap: () { currentIndex = index; pageController.jumpToPage(index); }, ); } }