login.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import 'package:dio/dio.dart';
  2. import 'package:e2ee_chat/common/global.dart';
  3. import 'package:e2ee_chat/l10n/localization_intl.dart';
  4. import 'package:e2ee_chat/presenter/login.dart';
  5. import 'package:e2ee_chat/presenter/theme_model.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:provider/provider.dart';
  8. import 'package:fluttertoast/fluttertoast.dart';
  9. class LoginRoute extends StatefulWidget {
  10. @override
  11. _LoginRouteState createState() => _LoginRouteState();
  12. }
  13. class _LoginRouteState extends State<LoginRoute> {
  14. TextEditingController _unameController = new TextEditingController();
  15. TextEditingController _pwdController = new TextEditingController();
  16. bool pwdShow = false; //密码是否显示明文
  17. GlobalKey _formKey = new GlobalKey<FormState>();
  18. bool _nameAutoFocus = true;
  19. @override
  20. void initState() {
  21. // 自动填充上次登录的用户名,填充后将焦点定位到密码输入框
  22. if (Global.profile.username != null) {
  23. _unameController.text = Global.profile.username!;
  24. _nameAutoFocus = true;
  25. }
  26. super.initState();
  27. }
  28. @override
  29. Widget build(BuildContext context) {
  30. return Scaffold(
  31. appBar: AppBar(title: Text(GmLocalizations.of(context).login)),
  32. body: Padding(
  33. padding: const EdgeInsets.all(16.0),
  34. child: Form(
  35. key: _formKey,
  36. autovalidateMode: AutovalidateMode.always, // TODO: what is AutovalidateMode?
  37. child: Column(
  38. children: <Widget>[
  39. TextFormField(
  40. autofocus: _nameAutoFocus,
  41. controller: _unameController,
  42. decoration: InputDecoration(
  43. labelText: GmLocalizations.of(context).userName,
  44. hintText: GmLocalizations.of(context).userNameOrEmail,
  45. prefixIcon: Icon(Icons.person),
  46. ),
  47. // 校验用户名(不能为空)
  48. validator: (v) {
  49. return v!.trim().isNotEmpty ? null : GmLocalizations.of(context).userNameRequired;
  50. }),
  51. TextFormField(
  52. controller: _pwdController,
  53. autofocus: !_nameAutoFocus,
  54. decoration: InputDecoration(
  55. labelText: GmLocalizations.of(context).password,
  56. hintText: GmLocalizations.of(context).password,
  57. prefixIcon: Icon(Icons.lock),
  58. suffixIcon: IconButton(
  59. icon: Icon(pwdShow ? Icons.visibility_off : Icons.visibility),
  60. onPressed: () {
  61. setState(() {
  62. pwdShow = !pwdShow;
  63. });
  64. },
  65. )),
  66. obscureText: !pwdShow,
  67. //校验密码(不能为空)
  68. validator: (v) {
  69. return v!.trim().isNotEmpty ? null : GmLocalizations.of(context).passwordRequired;
  70. },
  71. ),
  72. Padding(
  73. padding: const EdgeInsets.only(top: 25),
  74. child: ConstrainedBox(
  75. constraints: BoxConstraints.expand(height: 55.0),
  76. child: ElevatedButton(
  77. style: ButtonStyle(
  78. foregroundColor: MaterialStateProperty.all<Color>(Provider.of<ThemeModel>(context).theme),
  79. //TODO: something wrong with text color
  80. textStyle: MaterialStateProperty.all<TextStyle>(TextStyle(color: Colors.white)),
  81. ),
  82. onPressed: _onLogin,
  83. child: Text(GmLocalizations.of(context).login),
  84. ),
  85. ),
  86. ),
  87. ],
  88. ),
  89. ),
  90. ),
  91. );
  92. }
  93. void _onLogin() async {
  94. // 提交前,先验证各个表单字段是否合法
  95. if ((_formKey.currentState as FormState).validate()) {
  96. Fluttertoast.showToast(msg: GmLocalizations.of(context).loading);
  97. try {
  98. await LoginModel().loginOrRegister(_unameController.text, _pwdController.text);
  99. debug('isLogin: ${Global.profile.isLogin}');
  100. } on DioError catch (e) {
  101. //登录失败则提示
  102. if (e.response?.statusCode == 401) {
  103. Fluttertoast.showToast(msg: GmLocalizations.of(context).userNameOrPasswordWrong);
  104. } else {
  105. Fluttertoast.showToast(msg: e.toString());
  106. }
  107. } finally {
  108. if (Global.profile.isLogin) {
  109. debug('Login!');
  110. // 返回
  111. Navigator.of(context).pop();
  112. }
  113. }
  114. }
  115. }
  116. }