diff --git a/lib/common/request/dao/user_dao.dart b/lib/common/request/dao/user_dao.dart index 085ff1b..e164544 100644 --- a/lib/common/request/dao/user_dao.dart +++ b/lib/common/request/dao/user_dao.dart @@ -16,4 +16,11 @@ class UserDao { } return data; } + + static Future sendCode(phoneNumber,{smsType ='login'}) async { + final params = {'phoneNum':phoneNumber,'smsType':smsType}; + await requestClient.post( + Apis.sendSmsCode,data: params + ); + } } diff --git a/lib/pages/login/loginpage/bloc/login_bloc.dart b/lib/pages/login/loginpage/bloc/login_bloc.dart index 7277c95..4767cfa 100644 --- a/lib/pages/login/loginpage/bloc/login_bloc.dart +++ b/lib/pages/login/loginpage/bloc/login_bloc.dart @@ -1,3 +1,4 @@ +import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -82,7 +83,23 @@ class LoginBloc extends Bloc { } ///请求验证码 - void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter emitter) async {} + void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter emitter) async { + final phoneNumber = phoneNumController.text; + if (!RegexUtil.isMobileExact(phoneNumber)) { + EasyLoading.showToast('请检查手机号'); + return; + } + try { + await loading(() async { + await UserDao.sendCode(phoneNumber); + }); + emitter(SmsCodeRequestState()); + } catch (e) { + if (e is ApiException) { + EasyLoading.showToast(e.message??'请检查网络连接'); + } + } + } ///切换登陆方式 void _changeLoginType(ChangeLoginTypeEvent event, Emitter emitter) async { diff --git a/lib/pages/login/loginpage/login_page.dart b/lib/pages/login/loginpage/login_page.dart index 6b1095f..1b326be 100644 --- a/lib/pages/login/loginpage/login_page.dart +++ b/lib/pages/login/loginpage/login_page.dart @@ -41,116 +41,114 @@ class _LoginPageView extends StatelessWidget { final bloc = BlocProvider.of(context); return Scaffold( body: SafeArea( - child: ListView( - children: [ - Container( - padding: EdgeInsets.only(top: 25.h), - child: Stack( - children: [ - Positioned( - right: 29.w, - child: GestureDetector( - onTap: () => bloc.add(ChangeLoginTypeEvent()), + child: SingleChildScrollView( + child: Container( + padding: EdgeInsets.only(top: 25.h), + child: Stack( + children: [ + Positioned( + right: 29.w, + child: GestureDetector( + onTap: () => bloc.add(ChangeLoginTypeEvent()), + child: Container( + decoration: BoxDecoration( + image: DecorationImage(image: AssetImage('login_logo'.assetPng), fit: BoxFit.fill), + ), + padding: EdgeInsets.symmetric(horizontal: 18.w, vertical: 5.h), + child: Text( + bloc.isSmsLoginType ? '密码登陆' : '验证码密码', + style: TextStyle(fontSize: 16.sp), + ), + ), + )), + Center( + child: Column( + children: [ + Image.asset( + 'wow_logo'.assetPng, + height: 81.h, + width: 131.w, + ), + Offstage( + offstage: !bloc.isSmsLoginType, + child: _buildSmsViewWidget(), + ), + Offstage( + offstage: bloc.isSmsLoginType, + child: _buildPwdViewWidget(), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () => bloc.add(AgreementChangeEvent()), + child: Icon(bloc.agreement ? Icons.check_circle_outlined : Icons.circle_outlined, + color: bloc.agreement ? Colors.green : Colors.black), + ), + 6.horizontalSpace, + RichText( + text: TextSpan(children: [ + TextSpan( + text: '我已阅读并同意', + style: TextStyle( + fontSize: 12.sp, + color: const Color(0xFF333333), + )), + TextSpan( + text: '《用户隐私协议》', + style: TextStyle( + fontSize: 12.sp, + color: const Color(0xFF333333), + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { + 'urlStr': 'https://www.zhihu.com', + 'webViewTitle': '用户隐私协议' + }); + }), + TextSpan( + text: ',', style: TextStyle(fontSize: 12.sp, color: const Color(0xFF333333))), + TextSpan( + text: '《儿童隐私政策》', + style: TextStyle(fontSize: 12.sp, color: const Color(0xFF333333)), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { + 'urlStr': 'https://www.zhihu.com', + 'webViewTitle': '儿童隐私协议' + }); + }) + ]), + ) + ], + ), + GestureDetector( + onTap: () { + if (bloc.canLogin) { + bloc.add(RequestLoginEvent()); + } + }, child: Container( decoration: BoxDecoration( - image: DecorationImage(image: AssetImage('login_logo'.assetPng), fit: BoxFit.fill), + image: DecorationImage( + image: AssetImage( + bloc.canLogin ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), + fit: BoxFit.fill), ), - padding: EdgeInsets.symmetric(horizontal: 18.w, vertical: 5.h), + padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), child: Text( - bloc.isSmsLoginType ? '密码登陆' : '验证码密码', + '登录', style: TextStyle(fontSize: 16.sp), ), ), - )), - Center( - child: Column( - children: [ - Image.asset( - 'wow_logo'.assetPng, - height: 81.h, - width: 131.w, - ), - Offstage( - offstage: !bloc.isSmsLoginType, - child: _buildSmsViewWidget(), - ), - Offstage( - offstage: bloc.isSmsLoginType, - child: _buildPwdViewWidget(), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () => bloc.add(AgreementChangeEvent()), - child: Icon(bloc.agreement ? Icons.check_circle_outlined : Icons.circle_outlined, - color: bloc.agreement ? Colors.green : Colors.black), - ), - 6.horizontalSpace, - RichText( - text: TextSpan(children: [ - TextSpan( - text: '我已阅读并同意', - style: TextStyle( - fontSize: 12.sp, - color: const Color(0xFF333333), - )), - TextSpan( - text: '《用户隐私协议》', - style: TextStyle( - fontSize: 12.sp, - color: const Color(0xFF333333), - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { - 'urlStr': 'https://www.zhihu.com', - 'webViewTitle': '用户隐私协议' - }); - }), - TextSpan( - text: ',', style: TextStyle(fontSize: 12.sp, color: const Color(0xFF333333))), - TextSpan( - text: '《儿童隐私政策》', - style: TextStyle(fontSize: 12.sp, color: const Color(0xFF333333)), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { - 'urlStr': 'https://www.zhihu.com', - 'webViewTitle': '儿童隐私协议' - }); - }) - ]), - ) - ], - ), - GestureDetector( - onTap: () { - if (bloc.canLogin) { - bloc.add(RequestLoginEvent()); - } - }, - child: Container( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage( - bloc.canLogin ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), - fit: BoxFit.fill), - ), - padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), - child: Text( - '登录', - style: TextStyle(fontSize: 16.sp), - ), - ), - ) - ], - ), - ) - ], - ), - ) - ], + ) + ], + ), + ) + ], + ), + ), ), ), ); @@ -194,7 +192,10 @@ class _LoginPageView extends StatelessWidget { }, controller: bloc.checkNumController, )), - TimerWidget(canSendSms: bloc.canSendSms) + TimerWidget( + canSendSms: bloc.canSendSms, + sendSmsEvent: () => bloc.add(RequestSmsCodeEvent()), + ) ], ) ], diff --git a/lib/pages/login/loginpage/time_widget.dart b/lib/pages/login/loginpage/time_widget.dart index cbe5069..bd70045 100644 --- a/lib/pages/login/loginpage/time_widget.dart +++ b/lib/pages/login/loginpage/time_widget.dart @@ -5,17 +5,22 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/blocs/timerbloc/timer_bloc.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/timer_ticker.dart'; +import 'package:wow_english/pages/login/loginpage/bloc/login_bloc.dart'; class TimerWidget extends StatelessWidget { - const TimerWidget({super.key, required this.canSendSms}); + const TimerWidget({super.key, required this.canSendSms,this.sendSmsEvent}); final bool canSendSms; + final Function()? sendSmsEvent; @override Widget build(BuildContext context) { return BlocProvider( create: (_) => TimerBloc(ticker: const TimerTicker()), - child: TimerWidgetView(canSendSms: canSendSms,), + child: TimerWidgetView( + canSendSms: canSendSms, + sendSmsEvent: sendSmsEvent, + ), ); } } @@ -27,13 +32,24 @@ class TimerWidgetView extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( - listener: (context, s) { - if (s is FinishedState) { - ///重置计时器 - context.read().add(ResetEvent()); - } - }, + return MultiBlocListener( + listeners: [ + BlocListener( + listener: (context, s) { + if (s is FinishedState) { + ///重置计时器 + context.read().add(ResetEvent()); + } + }), + BlocListener( + listener: (context, s) { + if (s is SmsCodeRequestState) { + final bloc = BlocProvider.of(context); + ///开始倒计时 + bloc.add(StartEvent(duration: bloc.state.duration)); + } + }), + ], child: _buildCountdownWidget(), ); } @@ -45,7 +61,7 @@ class TimerWidgetView extends StatelessWidget { return GestureDetector( onTap: () { if (canSendSms && !bloc.isCountTimer ) { - bloc.add(StartEvent(duration: state.duration)); + sendSmsEvent?.call(); } }, child: Container(