Files
feature-next-arch/lib/features/v2/my/presentation/pages/my_page.dart

174 lines
6.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SystemUiOverlayStyle>(
value: const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.light,
),
child: Scaffold(
extendBodyBehindAppBar: true,
backgroundColor: MyColors.background,
body: BlocConsumer<MyCubit, MyState>(
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<MyCubit>();
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('确定'),
),
],
),
);
}
}