qhdkfq_regulatory_flutter/lib/pages/login_page.dart

293 lines
9.9 KiB
Dart
Raw Normal View History

2025-07-07 17:00:37 +08:00
// 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<LoginPage> {
final TextEditingController _phoneController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
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 = '手机号或密码错误,请重试';
// });
// }
// });
// }
}
}