import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _isLoading = false; bool _obscurePassword = true; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Theme.of(context).colorScheme.background, body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 60), // Logo and Title Column( children: [ Container( width: 120, height: 120, decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary, shape: BoxShape.circle, ), child: const Icon( Icons.theater_comedy, color: Colors.white, size: 60, ), ), const SizedBox(height: 24), Text( 'Drama Ling', style: Theme.of(context).textTheme.headlineLarge?.copyWith( color: Theme.of(context).colorScheme.primary, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( '歡迎回來!開始您的語言學習之旅', style: Theme.of(context).textTheme.bodyLarge?.copyWith( color: Theme.of(context).colorScheme.onBackground.withOpacity(0.7), ), textAlign: TextAlign.center, ), ], ), const SizedBox(height: 48), // Email Field TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: '電子郵件', hintText: '請輸入您的電子郵件', prefixIcon: Icon(Icons.email_outlined), ), validator: (value) { if (value == null || value.isEmpty) { return '請輸入電子郵件'; } if (!value.contains('@')) { return '請輸入有效的電子郵件格式'; } return null; }, ), const SizedBox(height: 16), // Password Field TextFormField( controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( labelText: '密碼', hintText: '請輸入您的密碼', prefixIcon: const Icon(Icons.lock_outlined), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return '請輸入密碼'; } if (value.length < 6) { return '密碼長度至少需要6個字符'; } return null; }, ), const SizedBox(height: 24), // Login Button SizedBox( height: 48, child: ElevatedButton( onPressed: _isLoading ? null : _handleLogin, child: _isLoading ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('登入'), ), ), const SizedBox(height: 16), // Forgot Password TextButton( onPressed: () { // TODO: 實現忘記密碼功能 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('忘記密碼功能開發中')), ); }, child: const Text('忘記密碼?'), ), const SizedBox(height: 32), // Divider Row( children: [ const Expanded(child: Divider()), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( '或', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context).colorScheme.onBackground.withOpacity(0.5), ), ), ), const Expanded(child: Divider()), ], ), const SizedBox(height: 32), // Register Button OutlinedButton( onPressed: () => context.go('/register'), child: const Text('建立新帳號'), ), ], ), ), ), ), ); } Future _handleLogin() async { if (!_formKey.currentState!.validate()) return; setState(() { _isLoading = true; }); try { // TODO: 實現實際的登入邏輯 await Future.delayed(const Duration(seconds: 2)); // 模擬API調用 if (mounted) { // 登入成功,導航到首頁 context.go('/home'); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('登入成功!')), ); } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('登入失敗:$e')), ); } } finally { if (mounted) { setState(() { _isLoading = false; }); } } } }