import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../core/theme/app_color_scheme.dart'; import '../../../core/theme/app_spacing.dart'; import '../../../providers/auth_provider.dart'; import '../main/main_page.dart'; /// 注册页面 class RegisterPage extends StatefulWidget { const RegisterPage({super.key}); @override State createState() => _RegisterPageState(); } class _RegisterPageState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); final _formKey = GlobalKey(); bool _obscurePassword = true; bool _obscureConfirmPassword = true; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColorScheme.darkBackground, appBar: AppBar( backgroundColor: Colors.transparent, elevation: 0, leading: IconButton( icon: const Icon(Icons.arrow_back, color: AppColorScheme.darkOnSurface), onPressed: () => Navigator.pop(context), ), ), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(AppSpacing.lg), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Logo const Center( child: Text( '\u20BF', style: TextStyle( fontSize: 48, color: AppColorScheme.darkPrimary, ), ), ), const SizedBox(height: 16), const Center( child: Text( '注册账号', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: AppColorScheme.darkOnSurface, ), ), ), const SizedBox(height: 48), // 用户名 TextFormField( controller: _usernameController, style: const TextStyle(color: AppColorScheme.darkOnSurface), decoration: const InputDecoration( hintText: '请输入账号(4-20位字母数字)', prefixIcon: Icon(Icons.person_outline, color: AppColorScheme.darkOnSurfaceVariant), ), validator: (value) { if (value == null || value.isEmpty) { return '请输入账号'; } if (value.length < 4) { return '账号至少4位'; } if (value.length > 20) { return '账号最多20位'; } return null; }, ), const SizedBox(height: 16), // 密码 TextFormField( controller: _passwordController, obscureText: _obscurePassword, style: const TextStyle(color: AppColorScheme.darkOnSurface), decoration: InputDecoration( hintText: '请输入密码(至少6位)', prefixIcon: const Icon(Icons.lock_outline, color: AppColorScheme.darkOnSurfaceVariant), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: AppColorScheme.darkOnSurfaceVariant, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return '请输入密码'; } if (value.length < 6) { return '密码至少6位'; } return null; }, ), const SizedBox(height: 16), // 确认密码 TextFormField( controller: _confirmPasswordController, obscureText: _obscureConfirmPassword, style: const TextStyle(color: AppColorScheme.darkOnSurface), decoration: InputDecoration( hintText: '请再次输入密码', prefixIcon: const Icon(Icons.lock_outline, color: AppColorScheme.darkOnSurfaceVariant), suffixIcon: IconButton( icon: Icon( _obscureConfirmPassword ? Icons.visibility_off : Icons.visibility, color: AppColorScheme.darkOnSurfaceVariant, ), onPressed: () { setState(() { _obscureConfirmPassword = !_obscureConfirmPassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return '请再次输入密码'; } if (value != _passwordController.text) { return '两次密码不一致'; } return null; }, ), const SizedBox(height: 32), // 注册按钮 Consumer( builder: (context, auth, _) { return ElevatedButton( onPressed: auth.isLoading ? null : _handleRegister, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.xxl), ), ), child: auth.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text('注 册', style: TextStyle(fontSize: 16)), ); }, ), const SizedBox(height: 16), // 登录链接 Center( child: TextButton( onPressed: () => Navigator.pop(context), child: const Text( '已有账号?立即登录', style: TextStyle(fontSize: 14), ), ), ), ], ), ), ), ), ); } Future _handleRegister() async { if (!_formKey.currentState!.validate()) return; final auth = context.read(); final response = await auth.register( _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 ?? '注册失败')), ); } } }