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.9), title: const Text('个人信息'), ), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( children: [ const SizedBox(height: 20), // 头像区 Center( child: CircleAvatar( radius: 50, backgroundColor: AppColors.primaryLight, backgroundImage: user?.avatarUrl != null ? NetworkImage(user!.avatarUrl!) : null, child: user?.avatarUrl == null ? const Icon( Icons.person, size: 48, color: AppColors.textHint, ) : null, ), ), const SizedBox(height: 20), Text( name, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w700, color: AppColors.textPrimary, ), ), const SizedBox(height: 6), Container( padding: const EdgeInsets.symmetric( horizontal: 14, vertical: 6, ), decoration: BoxDecoration( gradient: AppColors.surfaceGradient, borderRadius: BorderRadius.circular(20), border: Border.all(color: AppColors.borderLight), boxShadow: AppColors.cardShadowLight, ), child: Row( mainAxisSize: MainAxisSize.min, children: [ const Icon( Icons.phone_android, size: 16, color: AppColors.textSecondary, ), const SizedBox(width: 6), Text( phone.isNotEmpty ? phone : '未绑定手机', style: const TextStyle( fontSize: 14, color: AppColors.textSecondary, ), ), ], ), ), const SizedBox(height: 32), // 基础信息卡片 Container( width: double.infinity, padding: const EdgeInsets.all(20), decoration: BoxDecoration( gradient: AppColors.surfaceGradient, borderRadius: BorderRadius.circular(AppTheme.rLg), border: Border.all(color: AppColors.borderLight), boxShadow: AppColors.cardShadowLight, ), child: Column( children: [ _infoRow(Icons.person_outline, '姓名', name), const Divider(height: 24, color: AppColors.borderLight), _infoRow( Icons.phone_android, '手机号', phone.isNotEmpty ? phone : '未绑定', ), const Divider(height: 24, color: AppColors.borderLight), _infoRow( Icons.health_and_safety, '健康档案', '查看详情', onTap: () => pushRoute(ref, 'healthArchive'), ), ], ), ), const SizedBox(height: 40), // 退出登录 SizedBox( width: 200, child: OutlinedButton.icon( onPressed: () => _logout(context, ref), icon: const Icon(Icons.logout, size: 18), label: const Text('退出登录', style: TextStyle(fontSize: 16)), style: OutlinedButton.styleFrom( foregroundColor: AppColors.error, side: const BorderSide(color: AppColors.error), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), padding: const EdgeInsets.symmetric(vertical: 12), ), ), ), const SizedBox(height: 40), ], ), ), ), ); } Widget _infoRow( IconData icon, String label, String value, { VoidCallback? onTap, }) { return GestureDetector( onTap: onTap, child: Row( children: [ Container( width: 40, height: 40, decoration: BoxDecoration( gradient: AppColors.primaryGradient, borderRadius: BorderRadius.circular(12), boxShadow: AppColors.cardShadowLight, ), child: Icon(icon, size: 22, color: Colors.white), ), const SizedBox(width: 14), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: const TextStyle( fontSize: 13, color: AppColors.textHint, ), ), const SizedBox(height: 3), Text( value, style: const TextStyle( fontSize: 17, fontWeight: FontWeight.w500, color: AppColors.textPrimary, ), ), ], ), ), if (onTap != null) const Icon( Icons.chevron_right, size: 20, color: AppColors.textHint, ), ], ), ); } 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'); } } }