You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

187 lines
6.6 KiB

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<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
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<void> checkTokenAndFetchMarriageInfo() async {
// 调用userController中的getMarriageInformationDetail方法
final userController = Get.find<UserController>();
final userId = storage.read<String>('userId');
if(userId != null && userId.isNotEmpty){
await userController.getBaseUserInfo(userId, true);
}
}
initRTM() async {
String? userId = storage.read<String>('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<ConversationController>()) {
Get.put(ConversationController(), permanent: false);
}
return Obx(() {
// 在 Obx 内部直接访问 observable,不使用条件判断,确保 GetX 能够追踪变化
final controller = Get.find<ConversationController>();
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);
},
);
}
}