import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../core/constants/app_colors.dart'; import '../../../providers/auth_provider.dart'; import '../main/main_page.dart'; import 'register_page.dart'; /// 登录页面 class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); final _formKey = GlobalKey(); bool _obscurePassword = true; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.background, body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 60), // Logo const Center( child: Text( '模拟所', style: TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: AppColors.primary, ), ), ), const SizedBox(height: 8), const Center( child: Text( '虚拟货币模拟交易平台', style: TextStyle( fontSize: 14, color: AppColors.textSecondary, ), ), ), const SizedBox(height: 48), // 用户名输入 TextFormField( controller: _usernameController, style: const TextStyle(color: AppColors.textPrimary), decoration: InputDecoration( hintText: '请输入用户名', prefixIcon: const Icon(Icons.person_outline, color: AppColors.textSecondary), ), validator: (value) { if (value == null || value.isEmpty) { return '请输入用户名'; } return null; }, ), const SizedBox(height: 16), // 密码输入 TextFormField( controller: _passwordController, obscureText: _obscurePassword, style: const TextStyle(color: AppColors.textPrimary), decoration: InputDecoration( hintText: '请输入密码', prefixIcon: const Icon(Icons.lock_outline, color: AppColors.textSecondary), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: AppColors.textSecondary, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return '请输入密码'; } return null; }, ), const SizedBox(height: 32), // 登录按钮 Consumer( builder: (context, auth, _) { return ElevatedButton( onPressed: auth.isLoading ? null : _handleLogin, child: auth.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text('登录'), ); }, ), const SizedBox(height: 16), // 注册链接 Center( child: TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (_) => const RegisterPage()), ); }, child: const Text( '还没有账号?立即注册', style: TextStyle(fontSize: 14), ), ), ), ], ), ), ), ), ); } Future _handleLogin() async { if (!_formKey.currentState!.validate()) return; final auth = context.read(); final response = await auth.login( _usernameController.text.trim(), _passwordController.text, ); if (response.success && mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('登录成功')), ); Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => const MainPage()), ); } else if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(response.message ?? '登录失败')), ); } } }