import 'package:dio/dio.dart'; import 'package:e2ee_chat/common/global.dart'; import 'package:e2ee_chat/l10n/localization_intl.dart'; import 'package:e2ee_chat/presenter/login.dart'; import 'package:e2ee_chat/presenter/theme.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:fluttertoast/fluttertoast.dart'; class LoginRoute extends StatefulWidget { @override _LoginRouteState createState() => _LoginRouteState(); } class _LoginRouteState extends State { TextEditingController _unameController = new TextEditingController(); TextEditingController _pwdController = new TextEditingController(); bool pwdShow = false; //密码是否显示明文 GlobalKey _formKey = new GlobalKey(); bool _nameAutoFocus = true; @override void initState() { // 自动填充上次登录的用户名,填充后将焦点定位到密码输入框 if (Global.profile.username != null) { _unameController.text = Global.profile.username!; _nameAutoFocus = true; } super.initState(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(GmLocalizations.of(context).login)), body: Padding( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, autovalidateMode: AutovalidateMode.always, // TODO: what is AutovalidateMode? child: Column( children: [ TextFormField( autofocus: _nameAutoFocus, controller: _unameController, decoration: InputDecoration( labelText: GmLocalizations.of(context).userName, hintText: GmLocalizations.of(context).userNameOrEmail, prefixIcon: Icon(Icons.person), ), // 校验用户名(不能为空) validator: (v) { return v!.trim().isNotEmpty ? null : GmLocalizations.of(context).userNameRequired; }), TextFormField( controller: _pwdController, autofocus: !_nameAutoFocus, decoration: InputDecoration( labelText: GmLocalizations.of(context).password, hintText: GmLocalizations.of(context).password, prefixIcon: Icon(Icons.lock), suffixIcon: IconButton( icon: Icon(pwdShow ? Icons.visibility_off : Icons.visibility), onPressed: () { setState(() { pwdShow = !pwdShow; }); }, )), obscureText: !pwdShow, //校验密码(不能为空) validator: (v) { return v!.trim().isNotEmpty ? null : GmLocalizations.of(context).passwordRequired; }, ), Padding( padding: const EdgeInsets.only(top: 25), child: ConstrainedBox( constraints: BoxConstraints.expand(height: 55.0), child: ElevatedButton( style: ButtonStyle( foregroundColor: MaterialStateProperty.all(Provider.of(context).theme), //TODO: something wrong with text color textStyle: MaterialStateProperty.all(TextStyle(color: Colors.white)), ), onPressed: _onLogin, child: Text(GmLocalizations.of(context).login), ), ), ), ], ), ), ), ); } void _onLogin() async { // 提交前,先验证各个表单字段是否合法 if ((_formKey.currentState as FormState).validate()) { Fluttertoast.showToast(msg: GmLocalizations.of(context).loading); try { await LoginPresenter().loginOrRegister(_unameController.text, _pwdController.text); debug('isLogin: ${Global.profile.isLogin}'); } on DioError catch (e) { //登录失败则提示 if (e.response?.statusCode == 401) { Fluttertoast.showToast(msg: GmLocalizations.of(context).userNameOrPasswordWrong); } else { Fluttertoast.showToast(msg: e.toString()); } } finally { if (Global.profile.isLogin) { debug('Login!'); // 返回 Navigator.of(context).pop(); } } } } }