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: AppColors.cardBackground, 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.cardInner, 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( color: Colors.white, borderRadius: BorderRadius.circular(20), ), 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( color: AppColors.cardBackground, borderRadius: BorderRadius.circular(AppTheme.rLg), boxShadow: [AppTheme.shadowCard], ), 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( color: Colors.white, borderRadius: BorderRadius.circular(10), ), child: Icon(icon, size: 22, color: AppColors.textSecondary), ), 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'); } } }