SignInPage.dart 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_habit/common/BaseArchitectural.dart';
  3. import 'package:flutter_habit/common/I18N.dart';
  4. import 'package:flutter_habit/common/components/PopMenus.dart';
  5. import 'package:flutter_habit/provider/UserProvider.dart';
  6. import 'package:flutter_habit/network/Repository.dart';
  7. import 'package:flutter_habit/view/drawer/user/sign/ModifyPwdPage.dart';
  8. import 'package:flutter_habit/view/drawer/user/sign/SignUpPage.dart';
  9. import 'package:provider/provider.dart';
  10. class SignInPage extends StatelessWidget {
  11. @override
  12. Widget build(BuildContext context) {
  13. return MultiProvider(
  14. providers: [
  15. ChangeNotifierProvider<SignInPageService>(
  16. create: (_) => SignInPageService(context)),
  17. ChangeNotifierProvider<SignInPageModel>(
  18. create: (_) => SignInPageModel(context)),
  19. ],
  20. child: _SignInPageView(),
  21. );
  22. }
  23. }
  24. // model
  25. class SignInPageModel extends BaseModel {
  26. SignInPageModel(BuildContext context) : super(context);
  27. bool isRequesting;
  28. bool isPwdVisible;
  29. GlobalKey formKey;
  30. TextEditingController emailController;
  31. TextEditingController pwdController;
  32. @override
  33. void init(BuildContext context) {
  34. super.init(context);
  35. isRequesting = false;
  36. isPwdVisible = false;
  37. formKey = GlobalKey<FormState>();
  38. emailController = TextEditingController();
  39. emailController.text =
  40. Provider.of<UserProvider>(context, listen: false).email ?? "";
  41. pwdController = TextEditingController();
  42. }
  43. }
  44. // service
  45. class SignInPageService extends BaseProvider {
  46. SignInPageService(BuildContext context) : super(context);
  47. String validatorEmail(String v) {
  48. if (v.trim().isEmpty) {
  49. return I18N.of("邮箱不能为空");
  50. } else {
  51. return null;
  52. }
  53. }
  54. void pwdChangeVisible(BuildContext context) {
  55. SignInPageModel model =
  56. Provider.of<SignInPageModel>(context, listen: false);
  57. model.isPwdVisible = !model.isPwdVisible;
  58. model.refresh();
  59. }
  60. String validatorPwd(String v) {
  61. if (v.trim().isEmpty) {
  62. return I18N.of("密码不能为空");
  63. } else {
  64. return null;
  65. }
  66. }
  67. Future<void> signIn(BuildContext context) async {
  68. SignInPageModel model =
  69. Provider.of<SignInPageModel>(context, listen: false);
  70. model.isRequesting = true;
  71. model.refresh();
  72. if ((model.formKey.currentState as FormState).validate()) {
  73. Map map = await Repository.getInstance().signIn(
  74. context,
  75. model.emailController.text,
  76. model.pwdController.text,
  77. );
  78. if (map != null && map.isNotEmpty) {
  79. try {
  80. int uid = map["uid"];
  81. String token = map["token"];
  82. String email = model.emailController.text;
  83. Map userInfo = await Repository.getInstance().getUserInfo(uid);
  84. String userName = userInfo["userName"];
  85. String gender = userInfo["gender"];
  86. String birthday = userInfo["birthday"];
  87. int coins = await Repository.getInstance().getCoin(uid);
  88. List<int> photo = await Repository.getInstance().getPhoto(uid);
  89. UserProvider userProvider =
  90. Provider.of<UserProvider>(context, listen: false);
  91. userProvider.uid = uid;
  92. userProvider.token = token;
  93. userProvider.email = email;
  94. userProvider.userName = userName;
  95. userProvider.gender = gender;
  96. userProvider.birthday = birthday;
  97. userProvider.coins = coins;
  98. userProvider.photo = photo.isEmpty ? null : photo;
  99. userProvider.store();
  100. userProvider.refresh();
  101. } catch (e) {
  102. debugPrint(e.toString());
  103. await PopMenus.attention(
  104. context: context, content: Text(I18N.of("连接失败")));
  105. }
  106. await PopMenus.attention(
  107. context: context, content: Text(I18N.of("登陆成功")));
  108. Navigator.of(context).pop();
  109. }
  110. }
  111. model.isRequesting = false;
  112. model.refresh();
  113. }
  114. Future<void> toPwdResetPage(BuildContext context) async {
  115. SignInPageModel model =
  116. Provider.of<SignInPageModel>(context, listen: false);
  117. model.emailController.text = await Navigator.of(context)
  118. .push(MaterialPageRoute(builder: (_) => ModifyPwdPage()));
  119. model.refresh();
  120. }
  121. Future<void> toSignUpPage(BuildContext context) async {
  122. SignInPageModel model =
  123. Provider.of<SignInPageModel>(context, listen: false);
  124. model.emailController.text = await Navigator.of(context)
  125. .push(MaterialPageRoute(builder: (_) => SignUpPage()));
  126. model.refresh();
  127. }
  128. }
  129. // view
  130. class _SignInPageView extends StatelessWidget {
  131. @override
  132. Widget build(BuildContext context) {
  133. SignInPageService service =
  134. Provider.of<SignInPageService>(context, listen: false);
  135. SignInPageModel model = Provider.of<SignInPageModel>(context, listen: true);
  136. return Scaffold(
  137. appBar: AppBar(
  138. title: Text(I18N.of("登录")),
  139. ),
  140. body: Padding(
  141. padding: EdgeInsets.all(16),
  142. child: ListView(
  143. children: <Widget>[
  144. model.isRequesting ? LinearProgressIndicator() : Container(),
  145. Center(
  146. child: Icon(
  147. Icons.account_circle,
  148. size: 220,
  149. color: Theme.of(context).unselectedWidgetColor,
  150. ),
  151. ),
  152. Form(
  153. key: model.formKey,
  154. child: Column(
  155. children: <Widget>[
  156. TextFormField(
  157. controller: model.emailController,
  158. enabled: !model.isRequesting,
  159. decoration: InputDecoration(
  160. labelText: I18N.of("邮箱"),
  161. hintText: I18N.of("请输入您的邮箱"),
  162. prefixIcon: Icon(Icons.email),
  163. ),
  164. validator: (v) => service.validatorEmail(v),
  165. ),
  166. TextFormField(
  167. controller: model.pwdController,
  168. enabled: !model.isRequesting,
  169. obscureText: !model.isPwdVisible,
  170. decoration: InputDecoration(
  171. labelText: I18N.of("密码"),
  172. hintText: I18N.of("请输入您的密码"),
  173. prefixIcon: Icon(Icons.lock),
  174. suffixIcon: IconButton(
  175. icon: Icon(
  176. model.isPwdVisible
  177. ? Icons.visibility
  178. : Icons.visibility_off,
  179. ),
  180. onPressed: () => service.pwdChangeVisible(context),
  181. ),
  182. ),
  183. validator: (v) => service.validatorPwd(v),
  184. ),
  185. ],
  186. ),
  187. ),
  188. Padding(
  189. padding: EdgeInsets.only(top: 10, bottom: 10),
  190. child: ElevatedButton(
  191. child: Text(
  192. I18N.of("登录"),
  193. style: TextStyle(
  194. color: Theme.of(context).cardColor,
  195. ),
  196. ),
  197. style: ButtonStyle(
  198. backgroundColor: MaterialStateProperty.all(
  199. Theme.of(context).colorScheme.secondary),
  200. shape: MaterialStateProperty.all(RoundedRectangleBorder(
  201. borderRadius: BorderRadius.circular(5.0),
  202. ))),
  203. onPressed:
  204. model.isRequesting ? null : () => service.signIn(context),
  205. ),
  206. ),
  207. Row(
  208. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  209. children: <Widget>[
  210. TextButton(
  211. child: Text(I18N.of("忘记密码?")),
  212. onPressed: model.isRequesting
  213. ? null
  214. : () => service.toPwdResetPage(context),
  215. ),
  216. TextButton(
  217. child: Text(I18N.of("快速注册")),
  218. onPressed: model.isRequesting
  219. ? null
  220. : () => service.toSignUpPage(context),
  221. ),
  222. ],
  223. ),
  224. ],
  225. ),
  226. ),
  227. );
  228. }
  229. }