login.dart 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. import 'package:flutter/material.dart';
  2. import 'package:fluttertoast/fluttertoast.dart';
  3. import 'package:provider/provider.dart';
  4. import 'Welcome.dart';
  5. import 'models/user.dart';
  6. class LoginPage extends StatefulWidget {
  7. static const routeName = "/";
  8. @override
  9. _LoginPageState createState() {
  10. return _LoginPageState();
  11. }
  12. }
  13. class _LoginPageState extends State<LoginPage> {
  14. TextEditingController _pwdEditController;
  15. TextEditingController _userNameEditController;
  16. final FocusNode _userNameFocusNode = FocusNode();
  17. final FocusNode _pwdFocusNode = FocusNode();
  18. @override
  19. void initState() {
  20. super.initState();
  21. _pwdEditController = TextEditingController();
  22. _userNameEditController = TextEditingController();
  23. _pwdEditController.addListener(() => setState(() => {}));
  24. _userNameEditController.addListener(() => setState(() => {}));
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. final loginStatus = Provider.of<UserStatus>(context);
  29. return Scaffold(
  30. appBar: AppBar(
  31. leading: Icon(Icons.settings),
  32. title: Text("STAFF LOGIN"),
  33. backgroundColor: Colors.amber,
  34. elevation: 0,
  35. ),
  36. body: SingleChildScrollView(
  37. child: Column(
  38. crossAxisAlignment: CrossAxisAlignment.start,
  39. children: <Widget>[
  40. buildTopWidget(context),
  41. SizedBox(
  42. height: 80,
  43. ),
  44. buildEditWidget(context),
  45. buildLoginButton(loginStatus)
  46. ],
  47. ),
  48. ),
  49. );
  50. }
  51. /// 头部
  52. Widget buildTopWidget(BuildContext context) {
  53. double height = 200.0;
  54. double width = MediaQuery.of(context).size.width;
  55. return Container(
  56. width: width,
  57. height: height,
  58. color: Colors.amber,
  59. child: Stack(
  60. overflow: Overflow.visible, // 超出部分显示
  61. children: <Widget>[
  62. Positioned(
  63. left: (width - 90) / 2.0,
  64. top: height - 45,
  65. child: Container(
  66. width: 90.0,
  67. height: 90.0,
  68. decoration: BoxDecoration(
  69. ///阴影
  70. boxShadow: [
  71. BoxShadow(color: Theme.of(context).cardColor, blurRadius: 4.0)
  72. ],
  73. ///形状
  74. shape: BoxShape.circle,
  75. ///图片
  76. image: DecorationImage(
  77. fit: BoxFit.cover,
  78. image: NetworkImage(
  79. 'https://picsum.photos/id/1/150'),
  80. ),
  81. ),
  82. ),
  83. )
  84. ],
  85. ),
  86. );
  87. }
  88. Widget buildEditWidget(BuildContext context) {
  89. return Container(
  90. margin: EdgeInsets.only(left: 15, right: 15),
  91. child: Column(
  92. children: <Widget>[
  93. buildLoginNameTextField(),
  94. SizedBox(height: 20.0),
  95. buildPwdTextField(),
  96. ],
  97. ),
  98. );
  99. }
  100. Widget buildLoginNameTextField() {
  101. return Container(
  102. height: 40,
  103. decoration: BoxDecoration(
  104. color: Colors.grey[200],
  105. borderRadius: BorderRadius.all(Radius.circular(20.0)),
  106. ),
  107. child: Stack(
  108. children: <Widget>[
  109. Positioned(
  110. left: 16,
  111. top: 11,
  112. width: 18,
  113. height: 18,
  114. child: Icon(Icons.supervised_user_circle),
  115. ),
  116. Positioned(
  117. left: 45,
  118. top: 10,
  119. bottom: 10,
  120. width: 1,
  121. child: Container(
  122. color: Colors.black,
  123. ),
  124. ),
  125. Positioned(
  126. left: 55,
  127. right: 10,
  128. top: 10,
  129. height: 30,
  130. child: TextField(
  131. controller: _userNameEditController,
  132. focusNode: _userNameFocusNode,
  133. decoration: InputDecoration(
  134. hintText: "请输入用户名",
  135. border: InputBorder.none,
  136. ),
  137. style: TextStyle(fontSize: 14),
  138. ),
  139. )
  140. ],
  141. ),
  142. );
  143. }
  144. Widget buildPwdTextField() {
  145. return Container(
  146. height: 40,
  147. decoration: BoxDecoration(
  148. color: Colors.grey[200],
  149. borderRadius: BorderRadius.all(Radius.circular(20.0)),
  150. ),
  151. child: Stack(
  152. children: <Widget>[
  153. Positioned(
  154. left: 16,
  155. top: 11,
  156. width: 18,
  157. height: 18,
  158. child: Icon(Icons.security),
  159. ),
  160. Positioned(
  161. left: 45,
  162. top: 10,
  163. bottom: 10,
  164. width: 1,
  165. child: Container(
  166. color: Colors.black,
  167. ),
  168. ),
  169. Positioned(
  170. left: 55,
  171. right: 10,
  172. top: 10,
  173. height: 30,
  174. child: TextField(
  175. controller: _pwdEditController,
  176. focusNode: _pwdFocusNode,
  177. decoration: InputDecoration(
  178. hintText: "请输入密码",
  179. border: InputBorder.none,
  180. ),
  181. style: TextStyle(fontSize: 14),
  182. obscureText: true,
  183. /// 设置密码
  184. ),
  185. )
  186. ],
  187. ));
  188. }
  189. Widget buildLoginButton(UserStatus loginStatus) {
  190. return Container(
  191. margin: EdgeInsets.only(top: 40, left: 10, right: 10),
  192. padding: EdgeInsets.all(0),
  193. width: MediaQuery.of(context).size.width - 20,
  194. height: 40,
  195. child: RaisedButton(
  196. onPressed: () {
  197. print("【LoginPage】尝试登陆...");
  198. if (checkInput()) {
  199. Fluttertoast.showToast(
  200. msg: "登录成功",
  201. gravity: ToastGravity.CENTER,
  202. timeInSecForIos: 2,
  203. textColor: Colors.white,
  204. fontSize: 14.0);
  205. loginStatus.value = true;
  206. // print("loginStatus" + loginStatus.value);
  207. // Navigator.popAndPushNamed(context, OrderPage.routeName);
  208. print("【LoginPage】登陆完成,即将进行路由跳转...");
  209. Navigator.popAndPushNamed(context, WelcomePage.routeName);
  210. } else {
  211. Fluttertoast.showToast(
  212. msg: "账号或密码错误",
  213. gravity: ToastGravity.CENTER,
  214. timeInSecForIos: 2,
  215. textColor: Colors.white,
  216. fontSize: 14.0);
  217. }
  218. },
  219. child: Text("登录"),
  220. color: Colors.amber,
  221. textColor: Colors.white,
  222. shape: RoundedRectangleBorder(
  223. borderRadius: BorderRadius.all(Radius.circular(20.0)),
  224. ),
  225. ),
  226. );
  227. }
  228. bool checkInput() {
  229. if (_userNameEditController.text.length == 0) {
  230. Fluttertoast.showToast(
  231. msg: "请输入用户名",
  232. gravity: ToastGravity.CENTER,
  233. timeInSecForIos: 2,
  234. textColor: Colors.white,
  235. fontSize: 14.0);
  236. return false;
  237. } else if (_pwdEditController.text.length == 0) {
  238. Fluttertoast.showToast(
  239. msg: "请输入密码",
  240. gravity: ToastGravity.CENTER,
  241. timeInSecForIos: 2,
  242. textColor: Colors.white,
  243. fontSize: 14.0);
  244. return false;
  245. }
  246. return _userNameEditController.text == '1001' &&
  247. _pwdEditController.text == '1001';
  248. }
  249. }