import 'dart:async'; import 'package:farmer_client/models/app.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import '../../models/entities/person.dart'; import '../../services/user.dart'; import '../../widgets/Cell.dart'; class MyRouteLogin extends StatefulWidget { // 从其他页面跳转过来的 bool isBack = false; @protected @mustCallSuper void beforeShow() { assert(() { print("===========beforeShow==========="); return true; }()); if (Get.arguments != null) { isBack = Get.arguments['isBack']; } } @override State createState() => _RouteLogin(); } class _RouteLogin extends State { var userInfo = AppController.t.user; bool isButtonEnable = true; //按钮状态 是否可点击 String buttonText = '发送验证码'; //初始文本 int count = 60; //初始倒计时时间 var timer; //倒计时的计时器 TextEditingController mController = TextEditingController(); GetStorage box = GetStorage(); //获取验证码 void _initTimer() { timer = Timer.periodic(Duration(seconds: 1), (Timer timer) { count--; setState(() { if (count == 0) { timer.cancel(); //倒计时结束取消定时器 isButtonEnable = true; //按钮可点击 count = 60; //重置时间 buttonText = '发送验证码'; //重置按钮文本 } else { buttonText = '($count)s重发'; //更新文本内容 } }); }); } @override void initState() { super.initState(); //注册协议的手势 var location = AppController.t.testInt.value; print('--------------'); print(location); } @override void dispose() { timer?.cancel(); //销毁计时器 timer = null; mController.dispose(); super.dispose(); ///销毁 } // -------------逻辑分割------------------------------------------- var handlePhones = ''; var handleCodes = ''; var userContent = {'phones': '', 'code': ''}; bool _newValue = false; void _handlePhone(e) => { setState(() => {handlePhones = e}) }; void _handleCode(e) => { setState(() => {handleCodes = e}) }; // 获取验证码 void _buttonClickListen() { setState(() { if (isButtonEnable) { if (handlePhones != '') { isButtonEnable = false; //按钮状态标记 _initTimer(); getSMSCaptch(handlePhones); } else { Fluttertoast.showToast(msg: '请正确输入手机号!'); } } }); } //登录按钮 void _handelSubmit() { if (handleCodes == '' || handlePhones == '') { Fluttertoast.showToast(msg: '请输入验证码或手机号!'); } else { if (_newValue) { userLogin(handlePhones, handleCodes).then((value) { box.write("token", value['token']); box.write("tokenTimeout", value['tokenTimeout']); userInfo(Person.fromJson(value['person'])); if (widget.isBack) { Get.back(); } else { Get.offNamed("/home"); } }); } else { Fluttertoast.showToast(msg: '请阅读并同意相关隐私政策!'); } } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.transparent, resizeToAvoidBottomInset: false, body: GestureDetector( behavior: HitTestBehavior.translucent, onTap: () { FocusScope.of(context).requestFocus(FocusNode()); }, child: Container( decoration: const BoxDecoration( image: DecorationImage( image: AssetImage("images/icon_login.png"), fit: BoxFit.cover, ), ), child: ListView( children: [ SizedBox( height: 44.w, child: Center( child: Text( '登录', style: TextStyle( letterSpacing: 3, fontWeight: FontWeight.bold, color: const Color(0xFF333333), fontSize: 17.sp, ), ), ), ), Padding( padding: EdgeInsets.fromLTRB(15, 0, 0, 5), child: const Text( '您好!', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 33, ), ), ), Padding( padding: EdgeInsets.fromLTRB(15, 0, 0, 0), child: const Text( '欢迎进入农户端应用!', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 27, ), ), ), Cell( // margin: EdgeInsets.symmetric(horizontal: 13.w), margin: const EdgeInsets.fromLTRB(13, 43, 10, 0), header: Text( "+86", style: TextStyle( fontSize: 19.sp, ), ), child: TextField( maxLength: 11, keyboardType: TextInputType.number, style: TextStyle( fontSize: 17.sp, ), decoration: const InputDecoration( isCollapsed: true, contentPadding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), labelText: "请输入手机号码", counterText: '', //去掉计数 border: InputBorder.none, floatingLabelBehavior: FloatingLabelBehavior.never, ), onChanged: (e) { _handlePhone(e); }, ), footer: SizedBox( child: ElevatedButton( onPressed: () => { setState(() { _buttonClickListen(); }) }, child: Text( '$buttonText', style: TextStyle( fontSize: 15.sp, ), ), style: ButtonStyle( backgroundColor: isButtonEnable ? MaterialStateProperty.all(const Color(0xFFFF703B)) : MaterialStateProperty.all( const Color(0xFFCBCBCB)), shape: MaterialStateProperty.all( const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10)))), ), ), )), Cell( // margin: EdgeInsets.symmetric(horizontal: 13.w), margin: const EdgeInsets.fromLTRB(13, 16, 10, 0), header: Align( alignment: FractionalOffset(0.1, 0.5), child: Image.asset( 'images/phoneCode.png', width: 20, height: 20, ), ), child: TextField( keyboardType: TextInputType.number, style: TextStyle( fontSize: 17.sp, ), decoration: const InputDecoration( isCollapsed: true, contentPadding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), labelText: "请输入验证码", border: InputBorder.none, floatingLabelBehavior: FloatingLabelBehavior.never, ), onChanged: (e) { _handleCode(e); }, ), ), Container( height: 350.h, alignment: Alignment.bottomCenter, child: SizedBox( width: 315.w, height: 49.h, child: ElevatedButton( onPressed: () { _handelSubmit(); }, child: const Text( "登录", style: TextStyle( fontSize: 18, color: Colors.white, fontWeight: FontWeight.bold), ), style: ButtonStyle( elevation: MaterialStateProperty.all(0), backgroundColor: MaterialStateProperty.all(const Color(0xFFFF703B)), shape: MaterialStateProperty.all( const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(24.4)))), ), ), ), ), Container( padding: EdgeInsets.fromLTRB(10.0, 10, 0, 10), child: Row( children: [ Radio( value: true, activeColor: Color(0xFFFF703B), groupValue: _newValue, onChanged: (value) { setState(() { _newValue = value!; }); }), // SizedBox( // child:Text('文本协议/隐私政策',style: TextStyle(fontSize:15.sp,color: Color(0xffce3800))), // ), Text('请认真查看', style: TextStyle( fontSize: 14.sp, color: Color(0xff2a2a2a))), GestureDetector( onTap: () { Get.toNamed('/agreement'); }, child: Text('文本协议/隐私政策', style: TextStyle( fontSize: 14.sp, color: Color(0xffce3800))), ), Text(',确认之后选择此项', style: TextStyle( fontSize: 14.sp, color: Color(0xff2a2a2a))), // RichText( // text: TextSpan(children: [ // const TextSpan( // text: '请认真查看', // style: TextStyle(color: Color(0xff2a2a2a))), // TextSpan( // text: '文本协议/隐私政策,', // style: TextStyle(color: Color(0xffce3800)), // recognizer: // TapGestureRecognizer() //踩坑。。。recognizer 是手势交互 除了我现在些的是 点击交互,其他一般都是抽象类。 // ..onTap = () { // Get.toNamed('/agreement'); // }, // ), // const TextSpan( // text: '确认之后选择此项', // style: TextStyle(color: Color(0xff2a2a2a))), // ]), // ), ], )), ], ), ), ), ); } }