import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter/services.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/cubit/my_cubit.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/states/my_state.dart'; import 'package:maibu_satabot_v2/features/v2/my/di/my_di.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/constants/my_constants.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/widgets/user_profile_card.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/widgets/quick_action_card.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/widgets/menu_item_card.dart'; import 'package:maibu_satabot_v2/features/v2/my/presentation/pages/system_settings_page.dart'; /// 我的页面(100% 还原设计稿) class MyPage extends StatelessWidget { const MyPage({super.key}); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => MyDependencyInjector.createMyCubit()..loadData(), child: _MyPageContent(), ); } } class _MyPageContent extends StatelessWidget { const _MyPageContent(); @override Widget build(BuildContext context) { return AnnotatedRegion( value: const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: Brightness.light, ), child: Scaffold( extendBodyBehindAppBar: true, backgroundColor: MyColors.background, body: BlocConsumer( listener: (context, state) { if (state is MyError) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(state.message)), ); } }, builder: (context, state) { if (state is MyLoading) { return const Center( child: CircularProgressIndicator(color: MyColors.primary), ); } if (state is MyLoaded) { final cubit = context.read(); return Column( children: [ // 用户信息卡片(延伸到状态栏) UserProfileCard( name: state.userProfile.name, role: state.userProfile.role, onTap: () { // TODO: 跳转到个人信息页面 debugPrint('点击个人信息'); }, ), // 快捷入口卡片(负margin向上重叠) Transform.translate( offset: const Offset(0, -15), child: QuickActionCard( onMessageTap: () { debugPrint('我的消息'); }, onFavoriteTap: () { debugPrint('我的收藏'); }, onWorkOrderTap: () { debugPrint('我的工单'); }, ), ), // 菜单列表(白色卡片) Container( margin: const EdgeInsets.only(top: 15, left: 16, right: 16, bottom: 16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: const Color(0x0D000000), blurRadius: 10, offset: const Offset(0, 2), ), ], ), constraints: BoxConstraints( maxHeight: MediaQuery.of(context).size.height * 0.5, ), child: ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, itemCount: state.menuItems.length, itemBuilder: (context, index) { final item = state.menuItems[index]; return MenuItemCard( item: item, onTap: () => _handleMenuItemTap(context, cubit, item), onSwitchChanged: item.hasSwitch ? (value) => cubit.toggleNightMode(value) : null, ); }, ), ), ], ); } return const SizedBox.shrink(); }, ), ), ); } /// 处理菜单项点击 void _handleMenuItemTap(BuildContext context, MyCubit cubit, dynamic item) { switch (item.id) { case 'offline_cache': _showClearCacheDialog(context, cubit); break; case 'night_mode': // 由 Switch 处理 break; case 'system_settings': // 跳转到系统设置页面 Navigator.push( context, MaterialPageRoute( builder: (context) => const SystemSettingsPage(), ), ); break; default: debugPrint('点击菜单: ${item.title}'); // TODO: 根据 ID 跳转到对应页面 } } /// 显示清除缓存对话框 void _showClearCacheDialog(BuildContext context, MyCubit cubit) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('清除缓存'), content: const Text('确定要清除所有缓存数据吗?'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('取消'), ), TextButton( onPressed: () { Navigator.pop(context); cubit.clearCache(); }, child: const Text('确定'), ), ], ), ); } }