diff --git a/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart b/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart index f3b5a81..74999e1 100644 --- a/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart +++ b/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart @@ -1,5 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; part 'forget_pwd_home_event.dart'; part 'forget_pwd_home_state.dart'; @@ -56,7 +58,11 @@ class ForgetPwdHomeBloc extends Bloc { } void _setPassWord(SetPassWordEvent event,Emitter emitter) async { - + if(!RegexUtil.isMobileExact(phoneNumController.text)) { + EasyLoading.showToast('手机号不正确!'); + return; + } + emitter(SetPwdCheckCodeState()); } void _sendSmsCode(SendSmsCodeEvent event,Emitter emitter) async { diff --git a/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart b/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart index 06ddf01..cbe7bfa 100644 --- a/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart +++ b/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart @@ -4,7 +4,9 @@ part of 'forget_pwd_home_bloc.dart'; abstract class ForgetPwdHomeState {} class ForgetPwdHomeInitial extends ForgetPwdHomeState {} - +///是否能发送验证码 class SendSmsCodeTypeChangeState extends ForgetPwdHomeState {} - +///是否能设置密码 class SetPwdTypeChangeState extends ForgetPwdHomeState {} +///验证码验证是否成功 +class SetPwdCheckCodeState extends ForgetPwdHomeState {} diff --git a/lib/login/forgetpwd/forget_password_home_page.dart b/lib/login/forgetpwd/forget_password_home_page.dart index e09f174..38797a6 100644 --- a/lib/login/forgetpwd/forget_password_home_page.dart +++ b/lib/login/forgetpwd/forget_password_home_page.dart @@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; import 'package:wow_english/login/forgetpwd/bloc/forget_pwd_home_bloc.dart'; +import 'package:wow_english/route/route.dart'; class ForgetPasswordHomePage extends StatelessWidget { const ForgetPasswordHomePage({super.key}); @@ -12,165 +13,179 @@ class ForgetPasswordHomePage extends StatelessWidget { Widget build(BuildContext context) { return BlocProvider( create: (context) => ForgetPwdHomeBloc(), + child: _ForgetPasswordHomePageView(), + ); + } +} + +class _ForgetPasswordHomePageView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, state) { + if (state is SetPwdCheckCodeState) { + Navigator.of(context).pushNamed(AppRouteName.setPwd,arguments: {'phoneNumber':context.read().phoneNumController.text}); + } + }, child: _buildForgetPwdView(), ); } Widget _buildForgetPwdView() => BlocBuilder( - builder: (context, state) { - final bloc = BlocProvider.of(context); - return Scaffold( - body: Container( - color: Colors.white, - child: SafeArea( - child: ListView( - children: [ - Padding( - padding: EdgeInsets.only(left: 49.w,right: 10.w), - child: Column( - children: [ - 34.verticalSpace, - Row( - children: [ - Image.asset( - 'wow_logo'.assetPng, - height: 49.w, - width: 83.5.h, - ), - 12.5.horizontalSpace, - const Text( - '修改密码\n请输入您的手机号和验证码吧', - style: TextStyle( - fontSize: 16.5, - color: Color(0xFF666666) + builder: (context, state) { + final bloc = BlocProvider.of(context); + return Scaffold( + body: Container( + color: Colors.white, + child: SafeArea( + child: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 49.w,right: 10.w), + child: Column( + children: [ + 34.verticalSpace, + Row( + children: [ + Image.asset( + 'wow_logo'.assetPng, + height: 49.w, + width: 83.5.h, ), - ) - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - children: [ - 44.5.verticalSpace, - Row( - children: [ - Image.asset( - 'phone'.assetPng, - height: 45.h, - width: 35.w, - ), - 15.horizontalSpace, - Expanded( - child: TextFieldCustomerWidget( - height: 50.h, - hitText: '请输入当前手机号', - textInputType: TextInputType.phone, - bgImageName: 'Input_layer_up', - onChangeValue: (String value) { - bloc.add(PhoneNumChangeEvent()); - }, - controller: bloc.phoneNumController, - ) - ) - ], - ), - 11.5.verticalSpace, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'lock'.assetPng, - height: 34.h, - width: 31.w, - ), - 18.5.horizontalSpace, - Expanded( - child: TextFieldCustomerWidget( - hitText: '请输入验证码', - bgImageName: 'Input_layer_down', - onChangeValue: (String value) { - bloc.add(CheckCodeChangeEvent()); - }, - textInputType: TextInputType.emailAddress, - controller: bloc.checkNumController, - ) - ), - 16.5.horizontalSpace, - GestureDetector( - onTap: () { - if (bloc.canSendSms) { - bloc.add(SendSmsCodeEvent()); - } - }, - child: Container( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage( - bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng - ), - fit: BoxFit.fill + 12.5.horizontalSpace, + const Text( + '修改密码\n请输入您的手机号和验证码吧', + style: TextStyle( + fontSize: 16.5, + color: Color(0xFF666666) + ), + ) + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + children: [ + 44.5.verticalSpace, + Row( + children: [ + Image.asset( + 'phone'.assetPng, + height: 45.h, + width: 35.w, + ), + 15.horizontalSpace, + Expanded( + child: TextFieldCustomerWidget( + height: 50.h, + hitText: '请输入当前手机号', + textInputType: TextInputType.phone, + bgImageName: 'Input_layer_up', + onChangeValue: (String value) { + bloc.add(PhoneNumChangeEvent()); + }, + controller: bloc.phoneNumController, + ) + ) + ], + ), + 11.5.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + 'lock'.assetPng, + height: 34.h, + width: 31.w, + ), + 18.5.horizontalSpace, + Expanded( + child: TextFieldCustomerWidget( + hitText: '请输入验证码', + bgImageName: 'Input_layer_down', + onChangeValue: (String value) { + bloc.add(CheckCodeChangeEvent()); + }, + textInputType: TextInputType.emailAddress, + controller: bloc.checkNumController, + ) + ), + 16.5.horizontalSpace, + GestureDetector( + onTap: () { + if (bloc.canSendSms) { + bloc.add(SendSmsCodeEvent()); + } + }, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng + ), + fit: BoxFit.fill + ), ), - ), - padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0), - child: const Text( + padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0), + child: const Text( '获取验证码', - style: TextStyle( - fontSize: 16, - color: Colors.white + style: TextStyle( + fontSize: 16, + color: Colors.white + ), ), ), - ), - ) - ], - ) - ], - ) - ), - 2.verticalSpace, - Image.asset( - 'steven_bride'.assetPng, - height: 173.h, - width: 157.w, - ) - ], - ), - GestureDetector( - onTap: () { - if (bloc.canSetPwd) { - bloc.add(SetPassWordEvent()); - } - }, - child: Container( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage( - bloc.canSetPwd?'login_enter'.assetPng:'login_enter_dis'.assetPng - ), - fit: BoxFit.fill + ) + ], + ) + ], + ) ), - ), - padding: const EdgeInsets.symmetric( - horizontal: 28.0, - vertical: 14.0 - ), - child:const Text( - '确定', - style: TextStyle( - fontSize: 16 + 2.verticalSpace, + Image.asset( + 'steven_bride'.assetPng, + height: 173.h, + width: 157.w, + ) + ], + ), + GestureDetector( + onTap: () { + if (bloc.canSetPwd) { + bloc.add(SetPassWordEvent()); + } + }, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + bloc.canSetPwd?'login_enter'.assetPng:'login_enter_dis'.assetPng + ), + fit: BoxFit.fill + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 28.0, + vertical: 14.0 + ), + child:const Text( + '确定', + style: TextStyle( + fontSize: 16 + ), ), ), - ), - ) - ], - ), - ) - ], + ) + ], + ), + ) + ], + ), ), ), - ), - ); - } + ); + } ); } \ No newline at end of file diff --git a/lib/login/loginpage/bloc/login_bloc.dart b/lib/login/loginpage/bloc/login_bloc.dart index 45184fb..79780a3 100644 --- a/lib/login/loginpage/bloc/login_bloc.dart +++ b/lib/login/loginpage/bloc/login_bloc.dart @@ -16,15 +16,11 @@ class LoginBloc extends Bloc { bool _canLogin = false; ///是否可以发送验证码 bool _canSendSms = false; - ///正在发送验证码 - bool _sendSmsIng = false; ///是否阅读协议 bool _agreement = false; ///登陆方式 LoginType _loginType = LoginType.sms; - int _countDown = 0; - final TextEditingController phoneNumController = TextEditingController(); final TextEditingController checkNumController = TextEditingController(); @@ -32,21 +28,19 @@ class LoginBloc extends Bloc { bool get agreement => _agreement; LoginType get loginType => _loginType; bool get canSendSms => _canSendSms; - bool get sendSmsIng => _sendSmsIng; LoginBloc() : super(LoginInitial()) { on(_requestLoginApi); on(_changeLoginType); on(_changePhoneNumber); on(_agreementTypeChange); - on(_forgetPassword); on(_checkFiledChange); } ///请求登陆 void _requestLoginApi(RequestLoginEvent event, Emitter emitter) async { - + emitter(LoginResultChangeState()); } ///切换登陆方式 @@ -100,11 +94,6 @@ class LoginBloc extends Bloc { } } - ///忘记密码 - void _forgetPassword(ForgetPasswordEvent event, Emitter emitter) async { - - } - ///登陆状态判断 bool _loginStateChange() { if (_agreement) { diff --git a/lib/login/loginpage/bloc/login_event.dart b/lib/login/loginpage/bloc/login_event.dart index 27b6b32..ed963cb 100644 --- a/lib/login/loginpage/bloc/login_event.dart +++ b/lib/login/loginpage/bloc/login_event.dart @@ -2,19 +2,13 @@ part of 'login_bloc.dart'; @immutable abstract class LoginEvent {} - -class RequestLoginEvent extends LoginEvent {} - +///切换登陆方式 class ChangeLoginTypeEvent extends LoginEvent {} - +///输入手机号 class PhoneNumChangeEvent extends LoginEvent {} - +///输入验证码/密码 class CheckFieldChangeEvent extends LoginEvent {} - +///隐私协议点击 class AgreementChangeEvent extends LoginEvent {} - -class ForgetPasswordEvent extends LoginEvent {} - -class CountDownEvent extends LoginEvent {} - -class CancelCountDownEvent extends LoginEvent {} +///请求登陆 +class RequestLoginEvent extends LoginEvent {} diff --git a/lib/login/loginpage/bloc/login_state.dart b/lib/login/loginpage/bloc/login_state.dart index f1d0b1c..b824b30 100644 --- a/lib/login/loginpage/bloc/login_state.dart +++ b/lib/login/loginpage/bloc/login_state.dart @@ -4,13 +4,13 @@ part of 'login_bloc.dart'; abstract class LoginState {} class LoginInitial extends LoginState {} - +///登陆按钮状态 class LoginEventChangeState extends LoginState {} - +///切换登陆方式 class LoginTypeChangeState extends LoginState {} - +///发送验证码按钮状态 class SmsSendTypeChangeState extends LoginState {} - +///是否同意协议 class AgreementTypeChangeState extends LoginState {} - -class CountDownNumChangeState extends LoginState {} +///登陆请求结果 +class LoginResultChangeState extends LoginState {} diff --git a/lib/login/loginpage/login_page.dart b/lib/login/loginpage/login_page.dart index 2df802f..6ed68b5 100644 --- a/lib/login/loginpage/login_page.dart +++ b/lib/login/loginpage/login_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; @@ -15,6 +16,20 @@ class LoginPage extends StatelessWidget { Widget build(BuildContext context) { return BlocProvider( create: (context) => LoginBloc(), + child: _LoginPageView(), + ); + } +} + +class _LoginPageView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, state){ + if (state is LoginResultChangeState) { + EasyLoading.showToast('登陆接口回调'); + } + }, child: _buildLoginViewWidget(), ); } diff --git a/lib/login/loginpage/time_widget.dart b/lib/login/loginpage/time_widget.dart index 99755aa..14ce242 100644 --- a/lib/login/loginpage/time_widget.dart +++ b/lib/login/loginpage/time_widget.dart @@ -4,57 +4,62 @@ 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'; -class TimerWidget extends StatefulWidget { +class TimerWidget extends StatelessWidget { const TimerWidget({super.key, required this.canSendSms}); final bool canSendSms; @override - State createState() { - return _TimerWidgetState(); + Widget build(BuildContext context) { + return BlocProvider( + create: (_) => TimerBloc(ticker: const TimerTicker()), + child: TimerWidgetView(canSendSms: canSendSms,), + ); } } -class _TimerWidgetState extends State { - late bool sendSmsIng; +class TimerWidgetView extends StatelessWidget { + + final bool canSendSms; + + const TimerWidgetView({super.key, required this.canSendSms}); - @override - void initState() { - super.initState(); - sendSmsIng = false; - } @override Widget build(BuildContext context) { - return BlocProvider( - create: (_) => TimerBloc(ticker: const TimerTicker()), - child: _buildCountdownWidget(), + bool sendSmsIng = false; + return BlocListener( + listener: (context, s) { + if (s is RunningState) { + sendSmsIng = true; + } if (s is FinishedState) { + sendSmsIng = false; + context.read().add(ResetEvent()); + } else { + sendSmsIng = false; + } + }, + child: _buildCountdownWidget(sendSmsIng:sendSmsIng), ); } - Widget _buildCountdownWidget() => BlocBuilder( + Widget _buildCountdownWidget({required bool sendSmsIng}) => BlocBuilder( buildWhen: (prev, state) => prev.runtimeType != state.runtimeType, builder: (context,state) { final bloc = BlocProvider.of(context); final duration = bloc.state.duration; final secondsStr = (duration % 60).floor().toString().padLeft(2, '0'); - if (state is TimerInitial) { - sendSmsIng = true; - } else { - sendSmsIng = false; - } return GestureDetector( onTap: () { - if (widget.canSendSms && !sendSmsIng) { + if (canSendSms && !sendSmsIng) { bloc.add(ResetEvent()); - bloc.add(StartEvent(duration: bloc.state.duration)); } }, child: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage( - widget.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng + canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng ), fit: BoxFit.fill ), diff --git a/lib/login/setpwd/bloc/set_pwd_bloc.dart b/lib/login/setpwd/bloc/set_pwd_bloc.dart index 9504d7f..50747c3 100644 --- a/lib/login/setpwd/bloc/set_pwd_bloc.dart +++ b/lib/login/setpwd/bloc/set_pwd_bloc.dart @@ -6,6 +6,8 @@ part 'set_pwd_state.dart'; class SetPwdBloc extends Bloc { + final String? phoneNumber; + final TextEditingController passWordFirstController = TextEditingController(); final TextEditingController passWordSecondController = TextEditingController(); ///密码是否符合规则(第一个输入框) @@ -31,7 +33,7 @@ class SetPwdBloc extends Bloc { bool get ensure => _passwordCheck && _passwordEnsure; - SetPwdBloc() : super(SetPwdInitial()) { + SetPwdBloc(this.phoneNumber) : super(SetPwdInitial()) { on(_pwdEnsureTextChange); on(_pwdCheckTextChange); on(_setPassword); @@ -114,6 +116,6 @@ class SetPwdBloc extends Bloc { } void _setPassword(SetPasswordEvent event,Emitter emitter) async { - + emitter(PasswordSetSuccessState()); } } diff --git a/lib/login/setpwd/bloc/set_pwd_state.dart b/lib/login/setpwd/bloc/set_pwd_state.dart index 1ada084..a9f5c1e 100644 --- a/lib/login/setpwd/bloc/set_pwd_state.dart +++ b/lib/login/setpwd/bloc/set_pwd_state.dart @@ -14,3 +14,5 @@ class PasswordLargeState extends SetPwdState {} class PasswordIconShowState extends SetPwdState {} class PasswordCheckIconShowState extends SetPwdState {} + +class PasswordSetSuccessState extends SetPwdState {} diff --git a/lib/login/setpwd/set_pwd_page.dart b/lib/login/setpwd/set_pwd_page.dart index beeb968..3d84329 100644 --- a/lib/login/setpwd/set_pwd_page.dart +++ b/lib/login/setpwd/set_pwd_page.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/login/setpwd/bloc/set_pwd_bloc.dart'; +import 'package:wow_english/route/route.dart'; import '../../common/widgets/textfield_customer_widget.dart'; @@ -13,7 +14,21 @@ class SetPassWordPage extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => SetPwdBloc(), + create: (context) => SetPwdBloc(phoneNum), + child: _SetPassWordPageView(), + ); + } +} + +class _SetPassWordPageView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, s){ + if (s is PasswordSetSuccessState) { + Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); + } + }, child: _buildSetPwdView(), ); } @@ -129,6 +144,7 @@ class SetPassWordPage extends StatelessWidget { if (!bloc.ensure) { return; } + bloc.add(SetPasswordEvent()); }, child: Container( decoration: BoxDecoration(