import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:lucide_icons/lucide_icons.dart'; import '../../widgets/tab_content_layout.dart'; class ProfileScreen extends StatelessWidget { const ProfileScreen({super.key}); @override Widget build(BuildContext context) { const double bottomNavHeight = 90; return TabContentLayout( child: SingleChildScrollView( padding: EdgeInsets.fromLTRB(16, 8, 16, bottomNavHeight + 20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // User Header _buildUserHeader(context), const SizedBox(height: 24), // Stats Grid _buildStatsGrid(), const SizedBox(height: 20), // Joy Points Card _buildJoyPointsCard(context), const SizedBox(height: 24), // Menu List _buildMenuSection(context), const SizedBox(height: 24), // Logout Button _buildLogoutButton(), const SizedBox(height: 16), // Version Center( child: Text( 'Wei AI v2.5.0 (Neon Edition)', style: TextStyle( fontSize: 10, fontFamily: 'monospace', color: Colors.white.withOpacity(0.3), ), ), ), ], ), ), ); } Widget _buildUserHeader(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ // Avatar Container( padding: const EdgeInsets.all(2), decoration: BoxDecoration( shape: BoxShape.circle, gradient: const LinearGradient( colors: [Color(0xFFC084FC), Color(0xFFF472B6)], ), ), child: Container( width: 64, height: 64, decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: Colors.white.withOpacity(0.2), width: 2), image: const DecorationImage( image: NetworkImage('https://api.dicebear.com/7.x/avataaars/png?seed=commander'), fit: BoxFit.cover, ), ), ), ), const SizedBox(width: 16), // User Info Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Commander', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.white, ), ), const SizedBox(height: 4), Container( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), decoration: BoxDecoration( color: Colors.white.withOpacity(0.1), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.white.withOpacity(0.1)), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon(LucideIcons.crown, size: 12, color: const Color(0xFFFBBF24)), const SizedBox(width: 4), const Text( 'LV.4 黑金会员', style: TextStyle( fontSize: 11, fontWeight: FontWeight.bold, color: Colors.white, letterSpacing: 1, ), ), ], ), ), ], ), ], ), // Settings Button GestureDetector( onTap: () => context.push('/profile/settings'), child: Container( width: 44, height: 44, decoration: BoxDecoration( color: Colors.white.withOpacity(0.1), shape: BoxShape.circle, border: Border.all(color: Colors.white.withOpacity(0.1)), ), child: Icon(LucideIcons.settings, size: 20, color: Colors.white.withOpacity(0.7)), ), ), ], ); } Widget _buildStatsGrid() { final stats = [ {'label': '互动时长', 'val': '42', 'unit': 'h'}, {'label': '亲密指数', 'val': '85', 'unit': '%'}, {'label': '解锁剧本', 'val': '12', 'unit': '个'}, ]; return Row( children: stats.map((stat) { return Expanded( child: Container( margin: const EdgeInsets.symmetric(horizontal: 4), padding: const EdgeInsets.symmetric(vertical: 16), decoration: BoxDecoration( color: Colors.white.withOpacity(0.05), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.white.withOpacity(0.1)), ), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( stat['val']!, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold, fontFamily: 'monospace', color: Colors.white, ), ), Padding( padding: const EdgeInsets.only(bottom: 2), child: Text( stat['unit']!, style: TextStyle( fontSize: 10, color: Colors.white.withOpacity(0.6), ), ), ), ], ), const SizedBox(height: 4), Text( stat['label']!, style: TextStyle( fontSize: 10, letterSpacing: 1, color: Colors.white.withOpacity(0.5), ), ), ], ), ), ); }).toList(), ); } Widget _buildJoyPointsCard(BuildContext context) { return GestureDetector( onTap: () => context.push('/profile/topup'), child: Container( height: 120, decoration: BoxDecoration( borderRadius: BorderRadius.circular(24), gradient: const LinearGradient( colors: [Color(0xFF7C3AED), Color(0xFF9333EA), Color(0xFFDB2777)], ), boxShadow: [ BoxShadow( color: const Color(0xFFC084FC).withOpacity(0.4), blurRadius: 30, offset: const Offset(0, 10), ), ], ), child: Padding( padding: const EdgeInsets.all(20), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Row( children: [ Icon(LucideIcons.zap, size: 16, color: Colors.white.withOpacity(0.9)), const SizedBox(width: 6), Text( 'JOY POINTS', style: TextStyle( fontSize: 11, fontWeight: FontWeight.bold, letterSpacing: 2, color: Colors.white.withOpacity(0.9), ), ), ], ), const SizedBox(height: 4), const Text( '2,450', style: TextStyle( fontSize: 36, fontWeight: FontWeight.bold, fontFamily: 'monospace', color: Colors.white, ), ), ], ), Container( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(24), ), child: const Text( '立即充值', style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, color: Color(0xFF9333EA), ), ), ), ], ), ), ), ); } Widget _buildMenuSection(BuildContext context) { final menuItems = [ {'id': 'device', 'icon': LucideIcons.bluetooth, 'label': '我的设备', 'sub': 'Link-X Pro', 'route': '/profile/device'}, {'id': 'sub', 'icon': LucideIcons.creditCard, 'label': '订阅管理', 'sub': '', 'route': '/profile/subscription'}, {'id': 'privacy', 'icon': LucideIcons.shield, 'label': '隐私安全', 'sub': '', 'route': '/profile/privacy'}, {'id': 'help', 'icon': LucideIcons.helpCircle, 'label': '帮助与反馈', 'sub': '', 'route': '/profile/help'}, ]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 4, bottom: 8), child: Text( 'GENERAL', style: TextStyle( fontSize: 11, fontWeight: FontWeight.bold, letterSpacing: 2, color: Colors.white.withOpacity(0.4), ), ), ), ...menuItems.map((item) => _buildMenuItem( context, icon: item['icon'] as IconData, label: item['label'] as String, sub: item['sub'] as String, route: item['route'] as String, )), ], ); } Widget _buildMenuItem(BuildContext context, { required IconData icon, required String label, required String sub, required String route, }) { return GestureDetector( onTap: () => context.push(route), child: Container( margin: const EdgeInsets.only(bottom: 10), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white.withOpacity(0.05), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.white.withOpacity(0.1)), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: Colors.white.withOpacity(0.05), borderRadius: BorderRadius.circular(12), ), child: Icon(icon, size: 20, color: Colors.white.withOpacity(0.7)), ), const SizedBox(width: 14), Text( label, style: const TextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: Colors.white, ), ), ], ), Row( children: [ if (sub.isNotEmpty) Text( sub, style: TextStyle( fontSize: 12, color: Colors.white.withOpacity(0.5), ), ), const SizedBox(width: 8), Icon(LucideIcons.chevronRight, size: 18, color: Colors.white.withOpacity(0.3)), ], ), ], ), ), ); } Widget _buildLogoutButton() { return Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 16), decoration: BoxDecoration( color: Colors.white.withOpacity(0.05), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.red.withOpacity(0.3)), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(LucideIcons.logOut, size: 18, color: Colors.red[400]), const SizedBox(width: 8), Text( '退出登录', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Colors.red[400], ), ), ], ), ); } }