import 'dart:async'; import 'package:chat/data/UserData.dart'; import 'package:chat/data/WebData.dart'; import 'package:chat/data/constants.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/utils/CustomUI.dart'; import 'package:chat/utils/HttpUtil.dart'; import 'package:chat/utils/TokenMgr.dart'; import 'package:chat/utils/screen.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:wifi_info_plugin/wifi_info_plugin.dart'; import 'package:oktoast/oktoast.dart'; import '../utils/OtherLogin.dart'; const RATE_NUM = 0.82; const BlueColor = Constants.BlueTextColor; enum PageType { register, changePWD, bindPhone, } class RegisterPage extends StatefulWidget { @required final int type; RegisterPage({Key key, this.type}); _RegisterPageState createState() => _RegisterPageState(); } class _RegisterPageState extends State { String _phoneNumber = ''; String _selectType = UserData().language == LanguageType.Vietnamese ? phone.keys.toList()[1] : phone.keys.toList()[0]; String _verifyCode = ''; String _passWorld = ''; // String _rePassWorld = ''; bool isChangePWD = false; int _seconds = 0; String _verifyStr = ''; Timer _timer; @override void initState() { super.initState(); isChangePWD = widget.type == PageType.changePWD.index; } @override void dispose() { _cancelTimer(); super.dispose(); } _startTimer() { _seconds = 60 * 5; _timer = new Timer.periodic(new Duration(seconds: 1), (timer) { _seconds--; _verifyStr = '$_seconds(s)'; setState(() {}); if (_seconds == 0) { _verifyStr = I18n.of(context).send_again; _cancelTimer(); } }); } _cancelTimer() { _timer?.cancel(); } @override Widget build(BuildContext context) { String title = I18n.of(context).number_registration; if (widget.type == PageType.changePWD.index) { title = I18n.of(context).change_password; } else if (widget.type == PageType.bindPhone.index) { title = I18n.of(context).bind_phone1; } Widget appBar = new AppBar( backgroundColor: AppColors.NewAppbarBgColor, title: new Text( title, style: TextStyle(color: AppColors.NewAppbarTextColor), textScaleFactor: 1.0, ), leading: CustomUI.buildCustomLeading(context), centerTitle: true, ); return Scaffold( appBar: appBar, body: SafeArea( child: Center( child: Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: _buildBody(), ), )), resizeToAvoidBottomPadding: false, ); } Widget _buildBody() { return new Column( children: [ _buildAcountInput(), _buildSecurityInput(), _buildPasswordInput(), _buildLoginButton(), widget.type == PageType.register.index ? _buildOtherLogin() : Container(), ], ); } //构建底部第三方登陆 Widget _buildOtherLogin() { return new Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ new Container( alignment: Alignment.bottomCenter, child: OtherLogin().builder(context), ) ], ), ); } //账号输入框 Widget _buildAcountInput() { double height = 54.5; return new Container( alignment: Alignment.center, margin: EdgeInsets.only(top: 8.5), height: height, padding: EdgeInsets.only(left: 17), decoration: BoxDecoration( color: Colors.white, border: Border( top: Constants.GreyBorderSide, bottom: Constants.GreyBorderSide)), child: Stack( children: [ Container( width: Screen.width, height: height, alignment: Alignment.centerLeft, child: Icon( Icons.phone_android, color: BlueColor, size: Constants.TextFieldIconSize, ), ), Positioned( left: 46, child: Container( padding: EdgeInsets.only(top: 5), margin: EdgeInsets.all(0), alignment: Alignment.centerLeft, child: new DropdownButtonHideUnderline( child: new DropdownButton( items: phone.keys.map((key) { return DropdownMenuItem( child: new Text(key, textScaleFactor: 1.0), value: key, ); }).toList(), onChanged: (value) { setState(() { _selectType = value; }); }, value: _selectType, elevation: 24, //设置阴影的高度 style: new TextStyle( //设置文本框里面文字的样式 color: Constants.BlackTextColor, fontSize: 12, ), iconSize: 25.0, )), ), ), Positioned( left: 90, child: Container( alignment: Alignment.center, width: Screen.width - 90, height: height, child: TextField( keyboardAppearance: Brightness.light, decoration: new InputDecoration( hintText: I18n.of(context).enter_number, hintStyle: TextStyle(fontSize: 14), border: InputBorder.none, ), maxLines: 1, style: TextStyle(textBaseline: TextBaseline.alphabetic), inputFormatters: [ WhitelistingTextInputFormatter.digitsOnly, ], onChanged: (str) { _phoneNumber = str; setState(() {}); }, keyboardType: TextInputType.phone, ), ), ) ], )); } //验证码 Widget _buildSecurityInput() { Widget verifyCodeEdit = new TextField( keyboardAppearance: Brightness.light, decoration: new InputDecoration( hintText: I18n.of(context).enter_code, hintStyle: TextStyle(fontSize: 14), icon: new Icon( Icons.security, color: BlueColor, size: Constants.TextFieldIconSize, ), border: InputBorder.none, ), maxLines: 1, keyboardType: TextInputType.number, style: TextStyle(textBaseline: TextBaseline.alphabetic), inputFormatters: [ WhitelistingTextInputFormatter.digitsOnly, LengthLimitingTextInputFormatter(6) ], onChanged: (str) { _verifyCode = str; setState(() {}); }, ); void getSms() async { var data = { "mobile": phone[_selectType] + _phoneNumber, "type": 0, "language": UserData().language, }; data['sign'] = TokenMgr().getSign(data); try { Response res = await HttpUtil() .post('user/send/sms', data: data, isShowLoading: true); var resData = res.data; if (resData['code'] == 0) { setState(() { _startTimer(); }); } else { showToast(resData['msg']); } } catch (e) {} } Widget verifyCodeBtn = new InkWell( onTap: (_seconds == 0) ? () { if (_phoneNumber == null || _phoneNumber == "") { showToast(I18n.of(context).enter_number); return; } getSms(); } : null, child: new Container( margin: EdgeInsets.only(right: 21.5), padding: EdgeInsets.symmetric(vertical: 4, horizontal: 6), decoration: BoxDecoration( border: Border.all(color: BlueColor), borderRadius: BorderRadius.all(Radius.circular(15))), alignment: Alignment.center, child: new Text( '${_verifyStr == '' ? I18n.of(context).send_code : _verifyStr}', textScaleFactor: 1.0, style: new TextStyle(fontSize: 11.34, color: BlueColor), ), ), ); return new Container( alignment: Alignment.center, height: 54.5, padding: EdgeInsets.only(left: 17), decoration: BoxDecoration( color: Colors.white, border: Border(bottom: Constants.GreyBorderSide)), child: new Stack( alignment: Alignment.center, children: [ verifyCodeEdit, Positioned( right: 0, child: verifyCodeBtn, ) ], ), ); } //密码 Widget _buildPasswordInput() { return new Container( alignment: Alignment.center, height: 54.5, padding: EdgeInsets.only(left: 17), decoration: BoxDecoration( color: Colors.white, border: Border(bottom: Constants.GreyBorderSide)), child: new TextField( keyboardAppearance: Brightness.light, decoration: new InputDecoration( hintText: I18n.of(context).set_password2, hintStyle: TextStyle(fontSize: 14), icon: new Icon( Icons.lock, color: BlueColor, size: Constants.TextFieldIconSize, ), border: InputBorder.none, ), maxLines: 1, inputFormatters: [LengthLimitingTextInputFormatter(20)], obscureText: true, style: TextStyle(textBaseline: TextBaseline.alphabetic), onChanged: (str) { _passWorld = str; setState(() {}); }, ), ); } // //密码 // Widget _buildRePasswordInput() { // return new Container( // child: new TextField( // decoration: new InputDecoration( // hintText: '请重新输入登陆密码', // icon: new Icon(Icons.lock), // border: InputBorder.none, // ), // maxLines: 1, // obscureText: true, // onChanged: (str) { // _rePassWorld = str; // setState(() {}); // }, // ), // width: MediaQuery.of(context).size.width * RATE_NUM, // ); // } //下一步按钮 Widget _buildLoginButton() { Text text = new Text(I18n.of(context).submit, textScaleFactor: 1.0, style: TextStyle( fontSize: Constants.ShaderButtonFontSize, color: Colors.white)); void postRegister(phoneNum) async { var type = 0; if (widget.type == PageType.register.index) { type = 0; } else if (widget.type == PageType.bindPhone.index) { type = 1; } else { return; } var data = { "mobile": phoneNum, "code": _verifyCode, "pwd": _passWorld, "cPwd": _passWorld, "type": type, "language": UserData().language, }; data['sign'] = TokenMgr().getSign(data); data['userid'] = UserData().basicInfo.userId; data['lng'] = UserData().longitude; data['lat'] = UserData().latitude; try { WifiInfoWrapper wifiObject = await WifiInfoPlugin.wifiDetails; if (wifiObject != null) { data['routerName'] = wifiObject.ssid; data['mac'] = wifiObject.bssId; } } catch (e) { print(e); } try { Response res = await HttpUtil() .post('user/binding/mobile', data: data, isShowLoading: true); var resData = res.data; showToast(resData['msg']); if (resData['code'] == 0) { UserData().mobile = int.parse(phoneNum); if (widget.type == PageType.register.index) { HttpUtil().login(phoneNum, _passWorld, context); } if (widget.type == PageType.bindPhone.index) { Navigator.of(context).pop(); } } } catch (e) {} } void postChangePwd(phoneNum) async { var data = { "mobile": phoneNum, "code": _verifyCode, "newpassword": _passWorld, "confirmPassword": _passWorld, }; data['sign'] = TokenMgr().getSign(data); try { Response res = await HttpUtil() .post('password/setting/password', data: data, isShowLoading: true); var resData = res.data; showToast(resData['msg']); if (resData['code'] == 0) { Navigator.of(context).pop(); } else if (resData['code'] == -7) { showToast(I18n.of(context).not_register); } } catch (e) {} } callback() { if (_phoneNumber == null || _phoneNumber == "") { showToast(I18n.of(context).enter_number); return; } if (_verifyCode == null || _verifyCode == "" || _verifyCode.length != 6) { showToast(I18n.of(context).enter_code); return; } if (_passWorld == null || _passWorld == "") { showToast(I18n.of(context).enter_password); return; } if (_passWorld.length < 6) { showToast(I18n.of(context).password_limit); return; } var phoneNum = phone[_selectType] + _phoneNumber; !isChangePWD ? postRegister(phoneNum) : postChangePwd(phoneNum); } return InkWell( onTap: callback, child: Container( margin: EdgeInsets.only(top: 60), alignment: Alignment.center, height: Constants.ShaderButtonHeight, width: Screen.width * RATE_NUM, decoration: BoxDecoration( color: Constants.ConfrimButtonColor, border: Border.all(color: AppColors.NewAppbarTextColor.withAlpha(140)), borderRadius: BorderRadius.all(Radius.circular(Constants.BigButtonRadius))), child: text, ), ); } }