// ignore_for_file: use_build_context_synchronously import 'main_tab.dart'; import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: '登录页面', theme: ThemeData( primarySwatch: Colors.blue, inputDecorationTheme: const InputDecorationTheme( border: InputBorder.none, contentPadding: EdgeInsets.symmetric(horizontal: 8), ), ), home: const LoginPage(), debugShowCheckedModeBanner: false, ); } } class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override // ignore: library_private_types_in_public_api _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State { final TextEditingController _phoneController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); final GlobalKey _formKey = GlobalKey(); String _errorMessage = ''; bool _isLoading = false; bool _obscurePassword = true; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: SingleChildScrollView( child: Column( children: [ _buildHeader(), Transform.translate( offset: const Offset(0, -60), child: Container( decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(30), topRight: Radius.circular(30), ), ), child: Padding( padding: const EdgeInsets.only(top: 30), child: Column( children: [ const Text( '欢迎登录', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black, shadows: [ Shadow( blurRadius: 10, color: Colors.black45, offset: Offset(2, 2), ), ], ), ), const SizedBox(height: 12), Text( '秦皇岛开发区泰盛安管平台', style: TextStyle(fontSize: 18, color: Colors.black), ), // 手机号 _buildInputSection( label: "", controller: _phoneController, hintText: "请输入用户名", keyboardType: TextInputType.phone, validator: (value) { if (value == null || value.isEmpty) { return '请输入用户名'; } // if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(value)) { // return '请输入有效的手机号'; // } return null; }, ), Padding(padding: const EdgeInsets.symmetric(horizontal: 25), child: const Divider(height: 1, thickness: 1), ), // 密码 _buildInputSection( label: "", controller: _passwordController, hintText: "请输入密码", obscureText: _obscurePassword, // suffixIcon: IconButton( // icon: Icon( // _obscurePassword // ? Icons.visibility // : Icons.visibility_off, // color: Colors.grey, // ), // onPressed: () { // setState(() { // _obscurePassword = !_obscurePassword; // }); // }, // ), validator: (value) { if (value == null || value.isEmpty) { return '请输入密码'; } // if (value.length < 6) { // return '密码长度至少6位'; // } return null; }, ), Padding(padding: const EdgeInsets.symmetric(horizontal: 25), child: const Divider(height: 1, thickness: 1), ), // 登录按钮 Padding( padding: const EdgeInsets.symmetric( horizontal: 25, vertical: 24), child: SizedBox( width: double.infinity, height: 48, child: ElevatedButton( onPressed: _isLoading ? null : _handleLogin, style: ElevatedButton.styleFrom( backgroundColor: Colors.blue, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: _isLoading ? const CircularProgressIndicator( color: Colors.white, ) : const Text( '登录', style: TextStyle( fontSize: 18, color: Colors.white, fontWeight: FontWeight.bold, ), ), ), ), ), Padding(padding: const EdgeInsets.only(left: 30, right: 30), child:Text(" 本平台为互联网非涉密平台,严禁处理、传输国家秘密和工作秘密", style: TextStyle(color: Colors.red)) ) ], ), ), ), ), ], ), ), ); } // 顶部图片和文字 Widget _buildHeader() { return Stack( alignment: Alignment.center, children: [ Image.asset( 'assets/images/login-bg.png', width: double.infinity, fit: BoxFit.fitWidth, ), Positioned( bottom: 40, left: 30, child: Column( children: [ ], ), ), ], ); } // 输入区域组件 Widget _buildInputSection({ required String label, required TextEditingController controller, required String hintText, bool obscureText = false, TextInputType keyboardType = TextInputType.text, Widget? suffixIcon, String? Function(String?)? validator, }) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: const TextStyle( fontSize: 10, fontWeight: FontWeight.w500, color: Colors.black87, ), ), const SizedBox(height: 15), TextFormField( controller: controller, obscureText: obscureText, keyboardType: keyboardType, validator: validator, // 关键属性:让文字在行内垂直居中 textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( hintText: hintText, suffixIcon: suffixIcon, // 去掉默认的上下/左右 padding,让文字贴紧外层的 25 左边距 isDense: true, contentPadding: EdgeInsets.zero, ), ), ], ), ); } // 登录处理 void _handleLogin() { // 清除之前的错误信息 setState(() => _errorMessage = ''); Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const MainPage()), ); // if (_formKey.currentState?.validate() ?? false) { // setState(() => _isLoading = true); // // // 模拟登录请求 // Future.delayed(const Duration(seconds: 2), () { // setState(() => _isLoading = false); // // 登录成功,跳转到主页 // // Navigator.pushReplacement( // // context, // // MaterialPageRoute(builder: (context) => const MainPage()), // // ); // // 模拟登录逻辑 // if (_phoneController.text == "13800138000" && // _passwordController.text == "123456") { // // 登录成功,跳转到主页 // Navigator.pushReplacement( // context, // MaterialPageRoute(builder: (context) => const MainPage()), // ); // } else { // // 登录失败,显示错误信息 // setState(() { // _errorMessage = '手机号或密码错误,请重试'; // }); // } // }); // } } }