import 'package:flutter/material.dart'; import 'ai_writing_page.dart'; import 'ai_speaking_page.dart'; import '../../../core/network/ai_api_service.dart'; /// AI功能主页面 class AIMainPage extends StatefulWidget { const AIMainPage({Key? key}) : super(key: key); @override State createState() => _AIMainPageState(); } class _AIMainPageState extends State { final AIApiService _aiApiService = AIApiService(); Map? _usageStats; bool _isLoadingStats = false; @override void initState() { super.initState(); _loadUsageStats(); } Future _loadUsageStats() async { setState(() { _isLoadingStats = true; }); try { final stats = await _aiApiService.getAIUsageStats(); setState(() { _usageStats = stats; _isLoadingStats = false; }); } catch (e) { setState(() { _isLoadingStats = false; }); // 静默处理错误,不影响用户体验 } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('AI智能助手'), backgroundColor: Theme.of(context).primaryColor, foregroundColor: Colors.white, actions: [ IconButton( icon: const Icon(Icons.refresh), onPressed: _loadUsageStats, tooltip: '刷新统计', ), ], ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // 欢迎卡片 Card( elevation: 4, child: Container( width: double.infinity, padding: const EdgeInsets.all(20.0), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), gradient: LinearGradient( colors: [ Theme.of(context).primaryColor, Theme.of(context).primaryColor.withOpacity(0.8), ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Row( children: [ Icon( Icons.psychology, color: Colors.white, size: 32, ), SizedBox(width: 12), Text( 'AI智能助手', style: TextStyle( color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold, ), ), ], ), const SizedBox(height: 8), const Text( '让AI帮助您提升英语学习效果', style: TextStyle( color: Colors.white70, fontSize: 16, ), ), const SizedBox(height: 16), Row( children: [ _buildFeatureChip('智能批改', Icons.edit), const SizedBox(width: 8), _buildFeatureChip('口语评估', Icons.mic), const SizedBox(width: 8), _buildFeatureChip('个性推荐', Icons.recommend), ], ), ], ), ), ), const SizedBox(height: 24), // 功能模块 const Text( 'AI功能', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 16), // 功能卡片网格 GridView.count( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), crossAxisCount: 2, crossAxisSpacing: 16, mainAxisSpacing: 16, childAspectRatio: 1.2, children: [ _buildFeatureCard( title: '写作批改', subtitle: 'AI智能批改英文写作', icon: Icons.edit_note, color: Colors.blue, onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const AIWritingPage(), ), ); }, ), _buildFeatureCard( title: '口语评估', subtitle: 'AI评估发音和流利度', icon: Icons.record_voice_over, color: Colors.green, onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const AISpeakingPage(), ), ); }, ), _buildFeatureCard( title: '智能推荐', subtitle: '个性化学习内容推荐', icon: Icons.lightbulb, color: Colors.orange, onTap: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('智能推荐功能即将上线')), ); }, ), _buildFeatureCard( title: '练习生成', subtitle: 'AI生成个性化练习题', icon: Icons.quiz, color: Colors.purple, onTap: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('练习生成功能即将上线')), ); }, ), ], ), const SizedBox(height: 24), // 使用统计 if (_usageStats != null) Card( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Row( children: [ Icon(Icons.analytics, color: Colors.blue), SizedBox(width: 8), Text( '使用统计', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), ], ), const SizedBox(height: 16), Row( children: [ Expanded( child: _buildStatItem( '写作批改', '${_usageStats!['writing_corrections'] ?? 0}', Icons.edit, Colors.blue, ), ), Expanded( child: _buildStatItem( '口语评估', '${_usageStats!['speaking_evaluations'] ?? 0}', Icons.mic, Colors.green, ), ), ], ), const SizedBox(height: 12), Row( children: [ Expanded( child: _buildStatItem( '总使用次数', '${_usageStats!['total_usage'] ?? 0}', Icons.trending_up, Colors.orange, ), ), Expanded( child: _buildStatItem( '本月使用', '${_usageStats!['monthly_usage'] ?? 0}', Icons.calendar_month, Colors.purple, ), ), ], ), ], ), ), ), // 加载统计时的占位符 if (_isLoadingStats) const Card( child: Padding( padding: EdgeInsets.all(16.0), child: Center( child: Column( children: [ CircularProgressIndicator(), SizedBox(height: 8), Text('加载使用统计中...'), ], ), ), ), ), ], ), ), ); } Widget _buildFeatureChip(String label, IconData icon) { return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), borderRadius: BorderRadius.circular(16), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon(icon, color: Colors.white, size: 16), const SizedBox(width: 4), Text( label, style: const TextStyle( color: Colors.white, fontSize: 12, ), ), ], ), ); } Widget _buildFeatureCard({ required String title, required String subtitle, required IconData icon, required Color color, required VoidCallback onTap, }) { return Card( elevation: 2, child: InkWell( onTap: onTap, borderRadius: BorderRadius.circular(12), child: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: color.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon( icon, color: color, size: 32, ), ), const SizedBox(height: 12), Text( title, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: 4), Text( subtitle, style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), textAlign: TextAlign.center, ), ], ), ), ), ); } Widget _buildStatItem( String label, String value, IconData icon, Color color, ) { return Container( padding: const EdgeInsets.all(12), margin: const EdgeInsets.symmetric(horizontal: 4), decoration: BoxDecoration( color: color.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Column( children: [ Icon(icon, color: color, size: 24), const SizedBox(height: 8), Text( value, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: color, ), ), const SizedBox(height: 4), Text( label, style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), textAlign: TextAlign.center, ), ], ), ); } }