import 'dart:async'; import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:bot_toast/bot_toast.dart'; import 'package:dio/dio.dart'; import 'package:flustars/flustars.dart' show TextUtil; import 'package:flustars/flustars.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart' hide Response; import 'package:power_logger/power_logger.dart'; import 'package:provider/provider.dart'; import 'package:velocity_x/velocity_x.dart'; import 'package:akuCommunity/base/assets_image.dart'; import 'package:akuCommunity/base/base_style.dart'; import 'package:akuCommunity/const/resource.dart'; import 'package:akuCommunity/extensions/num_ext.dart'; import 'package:akuCommunity/pages/setting_page/agreement_page/agreement_page.dart'; import 'package:akuCommunity/pages/setting_page/agreement_page/privacy_page.dart'; import 'package:akuCommunity/pages/sign/sign_func.dart'; import 'package:akuCommunity/pages/sign/sign_up/sign_up_pick_plot_page.dart'; import 'package:akuCommunity/pages/tab_navigator.dart'; import 'package:akuCommunity/provider/sign_up_provider.dart'; import 'package:akuCommunity/provider/user_provider.dart'; import 'package:akuCommunity/utils/headers.dart'; class SignInPage extends StatefulWidget { SignInPage({Key key}) : super(key: key); @override _SignInPageState createState() => _SignInPageState(); } class _SignInPageState extends State { TextEditingController _phone = new TextEditingController(); TextEditingController _code = new TextEditingController(); Timer _timer; bool get validPhone => RegexUtil.isMobileSimple(_phone.text); bool get _canGetCode { bool timerActive = _timer?.isActive ?? false; return (!timerActive) && validPhone; } Container _containerImage() { return Container( alignment: Alignment.center, child: Image.asset( AssetsImage.LOGO, height: 184.w, width: 266.w, ), ); } Future _showLoginVerify() async { return await showCupertinoDialog( barrierDismissible: false, context: context, builder: (context) { return CupertinoAlertDialog( title: Text('点击登录即表示您已阅读并同意'), content: Text( '''点击登录即表示您已阅读并同意《小蜜蜂用户协议》《小蜜蜂隐私政策》(特别是免除或限制责任、管辖等粗体下划线标注的条款)。如您不同意上述协议的任何条款,您应立即停止登录及使用本软件及服务。'''), actions: [ CupertinoDialogAction( child: Text('同意'), onPressed: () => Get.back(result: true), ), CupertinoDialogAction( child: Text('拒绝'), onPressed: () => Get.back(result: false), ), ], ); }, ); } _parseLogin(bool result) async { final userProvider = Provider.of(Get.context, listen: false); final signUpProvider = Provider.of(Get.context, listen: false); if (!result) return; CancelFunc cancel = BotToast.showLoading(); Response response = await SignFunc.login(_phone.text, _code.text); LoggerData.addData(response); if (response.data['status']) { if (response.data['choose'] == 1) { userProvider.setLogin(response.data['token']); cancel(); Get.offAll(() => TabNavigator()); } else { cancel(); signUpProvider.setTel(_phone.text); await Get.to(() => SignUpPickPlotPage()); signUpProvider.clearAll(); } } else { BotToast.showText(text: response.data['message']); cancel(); } } Widget _inkWellLogin() { return Padding( padding: EdgeInsets.symmetric(horizontal: 80.w), child: MaterialButton( onPressed: () async { FocusScope.of(context).unfocus(); if (TextUtil.isEmpty(_phone.text)) BotToast.showText(text: '手机号不能为空'); else if (TextUtil.isEmpty(_code.text)) BotToast.showText(text: '验证码不能为空'); else { bool result = await _showLoginVerify(); _parseLogin(result); } }, height: 89.w, shape: StadiumBorder(), elevation: 0, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, child: '登陆'.text.bold.size(28.sp).color(ktextPrimary).make(), color: kPrimaryColor, ), ); } startTick() { _timer = Timer.periodic(Duration(seconds: 1), (timer) { if (timer.tick >= 60) { _timer.cancel(); _timer = null; } setState(() {}); }); } _buildTextField({ String hint, Widget prefix, Widget suffix, TextEditingController controller, }) { return Container( margin: EdgeInsets.symmetric(horizontal: 82.w), decoration: BoxDecoration( color: Color(0xFFFFF4D7), borderRadius: BorderRadius.circular(42.w), ), child: Row( children: [ 36.wb, 82.hb, prefix ?? SizedBox(), 20.wb, TextField( controller: controller, onChanged: (_) => setState(() {}), decoration: InputDecoration( isDense: true, hintText: hint, contentPadding: EdgeInsets.zero, border: InputBorder.none, hintStyle: TextStyle( color: Color(0xFF999999), fontSize: 28.sp, ), ), ).expand(), suffix != null ? Container( height: 29.w, width: 2.w, color: Color(0xFFD8D8D8), ) : SizedBox(), suffix ?? SizedBox(), ], ), ); } @override void dispose() { _timer?.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { FocusScope.of(context).requestFocus(FocusNode()); }, child: Container( color: Colors.white, child: ListView( children: [ 153.hb, _containerImage(), 16.hb, Container( alignment: Alignment.center, child: Text( '欢迎登录小蜜蜂', style: TextStyle( fontWeight: FontWeight.w600, fontSize: BaseStyle.fontSize38, color: ktextPrimary), ), ), 89.hb, _buildTextField( hint: '请输入手机号', controller: _phone, prefix: Image.asset( R.ASSETS_IMAGES_PHONE_LOGO_PNG, height: 50.w, width: 50.w, ), ), 26.hb, _buildTextField( prefix: Image.asset( R.ASSETS_IMAGES_CODE_LOGO_PNG, height: 50.w, width: 50.w, ), hint: '请输入验证码', controller: _code, suffix: MaterialButton( height: 82.w, shape: StadiumBorder(), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, child: Text( _timer?.isActive ?? false ? '${60 - _timer.tick}' : '获取验证码', style: TextStyle( color: BaseStyle.color999999, fontSize: BaseStyle.fontSize28, fontWeight: FontWeight.w500, ), ), onPressed: _canGetCode ? () { SignFunc.sendMessageCode(_phone.text); startTick(); } : null, ), ), SizedBox(height: 59.w), _inkWellLogin(), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ FlatButton( shape: StadiumBorder(), padding: EdgeInsets.zero, onPressed: AgreementPage().to, child: Text( '《小蜜蜂用户协议》', style: TextStyle( color: Colors.lightBlue, ), )), SizedBox(width: 15.w), FlatButton( shape: StadiumBorder(), padding: EdgeInsets.zero, onPressed: PrivacyPage().to, child: Text( '《小蜜蜂隐私政策》', style: TextStyle( color: Colors.lightBlue, ), )) ], ), ], )), ), ); } }