login_page.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_auth/models/config.dart';
  3. import 'package:flutter_auth/pages/background.dart';
  4. import 'package:flutter_auth/pages/register/register_page.dart';
  5. import 'package:flutter_auth/views/already_have_an_account_check.dart';
  6. import 'package:flutter_auth/views/responsive.dart';
  7. import 'package:flutter_svg/flutter_svg.dart';
  8. /// Description: login page
  9. /// Time : 08/24/2023 Thursday
  10. /// Author : liuyuqi.gov@msn.cn
  11. class LoginPage extends StatefulWidget {
  12. const LoginPage({super.key});
  13. @override
  14. State<LoginPage> createState() => _LoginPageState();
  15. }
  16. class _LoginPageState extends State<LoginPage> {
  17. @override
  18. Widget build(BuildContext context) {
  19. return Background(
  20. child: SingleChildScrollView(
  21. child: SafeArea(
  22. child: Responsive(
  23. mobile: buildLoginMobile(), desktop: buildLoginDesktop()),
  24. ),
  25. ));
  26. }
  27. Widget buildLoginDesktop() {
  28. return const Row(
  29. children: [
  30. Expanded(child: LoginTop()),
  31. Expanded(
  32. child: Row(
  33. mainAxisAlignment: MainAxisAlignment.center,
  34. children: [
  35. SizedBox(
  36. width: 450,
  37. child: LoginForm(),
  38. )
  39. ],
  40. ))
  41. ],
  42. );
  43. }
  44. Widget buildLoginMobile() {
  45. return const Column(
  46. mainAxisAlignment: MainAxisAlignment.center,
  47. children: [
  48. LoginTop(),
  49. Row(
  50. children: [
  51. Spacer(),
  52. Expanded(
  53. flex: 8,
  54. child: LoginForm(),
  55. ),
  56. Spacer()
  57. ],
  58. )
  59. ],
  60. );
  61. }
  62. }
  63. class LoginForm extends StatelessWidget {
  64. const LoginForm({super.key});
  65. @override
  66. Widget build(BuildContext context) {
  67. return Form(
  68. child: Column(
  69. children: [
  70. TextFormField(
  71. keyboardType: TextInputType.emailAddress,
  72. textInputAction: TextInputAction.next,
  73. cursorColor: kPrimaryColor,
  74. onSaved: (email) {},
  75. decoration: const InputDecoration(
  76. hintText: "邮箱账户",
  77. prefixIcon: Padding(
  78. padding: EdgeInsets.all(defaultPadding),
  79. child: Icon(Icons.person),
  80. ),
  81. ),
  82. ),
  83. Padding(
  84. padding: const EdgeInsets.symmetric(vertical: defaultPadding),
  85. child: TextFormField(
  86. textInputAction: TextInputAction.done,
  87. obscureText: true,
  88. cursorColor: kPrimaryColor,
  89. decoration: const InputDecoration(
  90. hintText: "密码",
  91. prefixIcon: Padding(
  92. padding: EdgeInsets.all(defaultPadding),
  93. child: Icon(Icons.lock),
  94. ),
  95. ),
  96. ),
  97. ),
  98. const SizedBox(height: defaultPadding),
  99. Hero(
  100. tag: "login_btn",
  101. child: ElevatedButton(
  102. onPressed: () {},
  103. child: const Text(
  104. "登录",
  105. ),
  106. ),
  107. ),
  108. const SizedBox(height: defaultPadding),
  109. AlreadyHaveAnAccountCheck(
  110. press: () {
  111. Navigator.push(
  112. context,
  113. MaterialPageRoute(
  114. builder: (context) {
  115. return const RegisterPage();
  116. },
  117. ),
  118. );
  119. },
  120. ),
  121. ],
  122. ),
  123. );
  124. }
  125. }
  126. class LoginTop extends StatelessWidget {
  127. const LoginTop({super.key});
  128. @override
  129. Widget build(BuildContext context) {
  130. return Column(
  131. children: [
  132. const Text(
  133. "登录",
  134. style: TextStyle(fontWeight: FontWeight.bold),
  135. ),
  136. const SizedBox(height: defaultPadding * 2),
  137. Row(
  138. children: [
  139. const Spacer(),
  140. Expanded(
  141. flex: 8,
  142. child: SvgPicture.asset("assets/icons/login.svg"),
  143. ),
  144. const Spacer(),
  145. ],
  146. ),
  147. const SizedBox(height: defaultPadding * 2),
  148. ],
  149. );
  150. }
  151. }