import 'package:flutter/material.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import 'package:provider/provider.dart'; import '../../../providers/auth_provider.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final formKey = GlobalKey(); @override Widget build(BuildContext context) { final theme = ShadTheme.of(context); return Scaffold( body: Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), child: Padding( padding: const EdgeInsets.all(24), child: ShadForm( key: formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Logo 和标题 Icon( LucideIcons.trendingUp, size: 64, color: theme.colorScheme.primary, ), const SizedBox(height: 24), Text( '模拟所', style: theme.textTheme.h1, textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( '虚拟货币模拟交易平台', style: theme.textTheme.muted, textAlign: TextAlign.center, ), const SizedBox(height: 48), // 用户名输入 ShadInputFormField( id: 'username', label: const Text('用户名'), placeholder: const Text('请输入用户名'), leading: const Icon(LucideIcons.user), validator: (value) { if (value == null || value.isEmpty) { return '请输入用户名'; } if (value.length < 3) { return '用户名至少 3 个字符'; } return null; }, ), const SizedBox(height: 16), // 密码输入 ShadInputFormField( id: 'password', label: const Text('密码'), placeholder: const Text('请输入密码'), obscureText: true, leading: const Icon(LucideIcons.lock), validator: (value) { if (value == null || value.isEmpty) { return '请输入密码'; } if (value.length < 6) { return '密码至少 6 个字符'; } return null; }, ), const SizedBox(height: 24), // 登录按钮 Consumer( builder: (context, auth, _) { return ShadButton( onPressed: auth.isLoading ? null : () async { if (formKey.currentState!.saveAndValidate()) { final values = formKey.currentState!.value; final response = await auth.login( values['username'], values['password'], ); // 登录成功后,Provider 会自动更新状态 // MaterialApp 的 Consumer 会自动切换到 MainPage if (!response.success && mounted) { // 只在失败时显示错误 showShadDialog( context: context, builder: (context) => ShadDialog.alert( title: const Text('登录失败'), description: Text( response.message ?? '用户名或密码错误', ), actions: [ ShadButton( child: const Text('确定'), onPressed: () => Navigator.of(context).pop(), ), ], ), ); } } }, child: auth.isLoading ? const SizedBox.square( dimension: 16, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text('登录'), ); }, ), const SizedBox(height: 16), // 注册链接 Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '还没有账号?', style: theme.textTheme.muted, ), ShadButton.link( onPressed: () { // 跳转到注册页面 // context.go('/register'); }, child: const Text('立即注册'), ), ], ), ], ), ), ), ), ), ); } }