import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/app_colors.dart'; import '../../core/app_theme.dart'; import '../../core/navigation_provider.dart'; import '../../providers/auth_provider.dart'; class ProfilePage extends ConsumerWidget { const ProfilePage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final auth = ref.watch(authProvider); final user = auth.user; final name = user?.name?.isNotEmpty == true ? user!.name! : '未设置昵称'; final phone = user?.phone ?? ''; return GradientScaffold( appBar: AppBar( backgroundColor: Colors.white.withValues(alpha: 0.86), leading: IconButton( icon: const Icon(Icons.arrow_back_ios_new_rounded, size: 19), onPressed: () => popRoute(ref), ), title: const Text( '个人信息', style: TextStyle(fontSize: 20, fontWeight: FontWeight.w800), ), centerTitle: true, ), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.fromLTRB(20, 18, 20, 34), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _ProfileHero( name: name, phone: phone, avatarUrl: user?.avatarUrl, ), const SizedBox(height: 18), _InfoPanel( children: [ _InfoRow( icon: Icons.badge_rounded, label: '姓名', value: name, colors: const [Color(0xFF7DD3FC), Color(0xFF2563EB)], ), const _SoftDivider(), _InfoRow( icon: Icons.phone_iphone_rounded, label: '手机号', value: phone.isNotEmpty ? phone : '未绑定手机', colors: const [Color(0xFFA78BFA), Color(0xFF7C3AED)], ), const _SoftDivider(), _InfoRow( icon: Icons.folder_shared_rounded, label: '健康档案', value: '查看和维护基础健康资料', colors: const [Color(0xFF2DD4BF), Color(0xFF0F766E)], onTap: () => pushRoute(ref, 'healthArchive'), ), ], ), const SizedBox(height: 18), _InfoPanel( children: [ _InfoRow( icon: Icons.verified_user_rounded, label: '隐私保护', value: '健康数据仅用于个人健康管理', colors: const [Color(0xFFFBBF24), Color(0xFFEA580C)], ), ], ), const SizedBox(height: 28), OutlinedButton.icon( onPressed: () => _logout(context, ref), icon: const Icon(Icons.logout_rounded, size: 19), label: const Text('退出登录'), style: OutlinedButton.styleFrom( foregroundColor: AppColors.error, side: BorderSide( color: AppColors.error.withValues(alpha: 0.34), ), minimumSize: const Size.fromHeight(52), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w800, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(18), ), ), ), ], ), ), ), ); } Future _logout(BuildContext context, WidgetRef ref) async { final ok = await showDialog( context: context, builder: (ctx) => AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppTheme.rXl), ), title: const Text('退出登录'), content: const Text('确定退出当前账号?'), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: const Text('取消'), ), TextButton( onPressed: () => Navigator.pop(ctx, true), child: const Text('确定', style: TextStyle(color: AppColors.error)), ), ], ), ); if (ok == true) { await ref.read(authProvider.notifier).logout(); goRoute(ref, 'login'); } } } class _ProfileHero extends StatelessWidget { final String name; final String phone; final String? avatarUrl; const _ProfileHero({ required this.name, required this.phone, required this.avatarUrl, }); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [Color(0xFFEEF2FF), Color(0xFFF7ECFF), Color(0xFFEFFBF9)], ), borderRadius: BorderRadius.circular(30), border: Border.all(color: Colors.white, width: 1.5), boxShadow: [ BoxShadow( color: const Color(0xFF6D5DF6).withValues(alpha: 0.10), blurRadius: 24, offset: const Offset(0, 14), ), ], ), child: Row( children: [ Container( width: 76, height: 76, padding: const EdgeInsets.all(3), decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [Color(0xFF38BDF8), Color(0xFFC084FC)], ), borderRadius: BorderRadius.circular(28), ), child: ClipRRect( borderRadius: BorderRadius.circular(25), child: avatarUrl != null ? Image.network(avatarUrl!, fit: BoxFit.cover) : const ColoredBox( color: Colors.white, child: Icon( Icons.person_rounded, color: Color(0xFF7C3AED), size: 42, ), ), ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( name, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w900, color: AppColors.textPrimary, ), ), const SizedBox(height: 7), Text( phone.isNotEmpty ? phone : '未绑定手机', maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w700, color: AppColors.textSecondary, ), ), ], ), ), ], ), ); } } class _InfoPanel extends StatelessWidget { final List children; const _InfoPanel({required this.children}); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), decoration: BoxDecoration( color: Colors.white.withValues(alpha: 0.88), borderRadius: BorderRadius.circular(26), border: Border.all(color: Colors.white, width: 1.4), boxShadow: AppColors.cardShadowLight, ), child: Column(children: children), ); } } class _InfoRow extends StatelessWidget { final IconData icon; final String label; final String value; final List colors; final VoidCallback? onTap; const _InfoRow({ required this.icon, required this.label, required this.value, required this.colors, this.onTap, }); @override Widget build(BuildContext context) { return InkWell( onTap: onTap, borderRadius: BorderRadius.circular(18), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 2, vertical: 12), child: Row( children: [ Container( width: 42, height: 42, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: colors, ), borderRadius: BorderRadius.circular(16), ), child: Icon(icon, color: Colors.white, size: 22), ), const SizedBox(width: 13), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.w700, color: AppColors.textHint, ), ), const SizedBox(height: 4), Text( value, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w800, color: AppColors.textPrimary, ), ), ], ), ), if (onTap != null) const Icon( Icons.arrow_forward_ios_rounded, size: 16, color: AppColors.textHint, ), ], ), ), ); } } class _SoftDivider extends StatelessWidget { const _SoftDivider(); @override Widget build(BuildContext context) { return const Divider(height: 1, color: Color(0xFFF1F3F8)); } }