Commit e1f365548c0ee1cb18b58e9ac8f77823de86493b

Authored by liangchengyou
1 parent 17a80689

feat:调整状态监听逻辑

lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart
1 import 'package:flutter/cupertino.dart'; 1 import 'package:flutter/cupertino.dart';
2 import 'package:flutter_bloc/flutter_bloc.dart'; 2 import 'package:flutter_bloc/flutter_bloc.dart';
  3 +import 'package:common_utils/common_utils.dart';
  4 +import 'package:flutter_easyloading/flutter_easyloading.dart';
3 5
4 part 'forget_pwd_home_event.dart'; 6 part 'forget_pwd_home_event.dart';
5 part 'forget_pwd_home_state.dart'; 7 part 'forget_pwd_home_state.dart';
@@ -56,7 +58,11 @@ class ForgetPwdHomeBloc extends Bloc<ForgetPwdHomeEvent, ForgetPwdHomeState> { @@ -56,7 +58,11 @@ class ForgetPwdHomeBloc extends Bloc<ForgetPwdHomeEvent, ForgetPwdHomeState> {
56 } 58 }
57 59
58 void _setPassWord(SetPassWordEvent event,Emitter<ForgetPwdHomeState> emitter) async { 60 void _setPassWord(SetPassWordEvent event,Emitter<ForgetPwdHomeState> emitter) async {
59 - 61 + if(!RegexUtil.isMobileExact(phoneNumController.text)) {
  62 + EasyLoading.showToast('手机号不正确!');
  63 + return;
  64 + }
  65 + emitter(SetPwdCheckCodeState());
60 } 66 }
61 67
62 void _sendSmsCode(SendSmsCodeEvent event,Emitter<ForgetPwdHomeState> emitter) async { 68 void _sendSmsCode(SendSmsCodeEvent event,Emitter<ForgetPwdHomeState> emitter) async {
lib/login/forgetpwd/bloc/forget_pwd_home_state.dart
@@ -4,7 +4,9 @@ part of &#39;forget_pwd_home_bloc.dart&#39;; @@ -4,7 +4,9 @@ part of &#39;forget_pwd_home_bloc.dart&#39;;
4 abstract class ForgetPwdHomeState {} 4 abstract class ForgetPwdHomeState {}
5 5
6 class ForgetPwdHomeInitial extends ForgetPwdHomeState {} 6 class ForgetPwdHomeInitial extends ForgetPwdHomeState {}
7 - 7 +///是否能发送验证码
8 class SendSmsCodeTypeChangeState extends ForgetPwdHomeState {} 8 class SendSmsCodeTypeChangeState extends ForgetPwdHomeState {}
9 - 9 +///是否能设置密码
10 class SetPwdTypeChangeState extends ForgetPwdHomeState {} 10 class SetPwdTypeChangeState extends ForgetPwdHomeState {}
  11 +///验证码验证是否成功
  12 +class SetPwdCheckCodeState extends ForgetPwdHomeState {}
lib/login/forgetpwd/forget_password_home_page.dart
@@ -4,6 +4,7 @@ import &#39;package:flutter_screenutil/flutter_screenutil.dart&#39;; @@ -4,6 +4,7 @@ import &#39;package:flutter_screenutil/flutter_screenutil.dart&#39;;
4 import 'package:wow_english/common/extension/string_extension.dart'; 4 import 'package:wow_english/common/extension/string_extension.dart';
5 import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; 5 import 'package:wow_english/common/widgets/textfield_customer_widget.dart';
6 import 'package:wow_english/login/forgetpwd/bloc/forget_pwd_home_bloc.dart'; 6 import 'package:wow_english/login/forgetpwd/bloc/forget_pwd_home_bloc.dart';
  7 +import 'package:wow_english/route/route.dart';
7 8
8 class ForgetPasswordHomePage extends StatelessWidget { 9 class ForgetPasswordHomePage extends StatelessWidget {
9 const ForgetPasswordHomePage({super.key}); 10 const ForgetPasswordHomePage({super.key});
@@ -12,165 +13,179 @@ class ForgetPasswordHomePage extends StatelessWidget { @@ -12,165 +13,179 @@ class ForgetPasswordHomePage extends StatelessWidget {
12 Widget build(BuildContext context) { 13 Widget build(BuildContext context) {
13 return BlocProvider( 14 return BlocProvider(
14 create: (context) => ForgetPwdHomeBloc(), 15 create: (context) => ForgetPwdHomeBloc(),
  16 + child: _ForgetPasswordHomePageView(),
  17 + );
  18 + }
  19 +}
  20 +
  21 +class _ForgetPasswordHomePageView extends StatelessWidget {
  22 + @override
  23 + Widget build(BuildContext context) {
  24 + return BlocListener<ForgetPwdHomeBloc, ForgetPwdHomeState>(
  25 + listener: (context, state) {
  26 + if (state is SetPwdCheckCodeState) {
  27 + Navigator.of(context).pushNamed(AppRouteName.setPwd,arguments: {'phoneNumber':context.read<ForgetPwdHomeBloc>().phoneNumController.text});
  28 + }
  29 + },
15 child: _buildForgetPwdView(), 30 child: _buildForgetPwdView(),
16 ); 31 );
17 } 32 }
18 33
19 Widget _buildForgetPwdView() => BlocBuilder<ForgetPwdHomeBloc, ForgetPwdHomeState>( 34 Widget _buildForgetPwdView() => BlocBuilder<ForgetPwdHomeBloc, ForgetPwdHomeState>(
20 - builder: (context, state) {  
21 - final bloc = BlocProvider.of<ForgetPwdHomeBloc>(context);  
22 - return Scaffold(  
23 - body: Container(  
24 - color: Colors.white,  
25 - child: SafeArea(  
26 - child: ListView(  
27 - children: [  
28 - Padding(  
29 - padding: EdgeInsets.only(left: 49.w,right: 10.w),  
30 - child: Column(  
31 - children: [  
32 - 34.verticalSpace,  
33 - Row(  
34 - children: [  
35 - Image.asset(  
36 - 'wow_logo'.assetPng,  
37 - height: 49.w,  
38 - width: 83.5.h,  
39 - ),  
40 - 12.5.horizontalSpace,  
41 - const Text(  
42 - '修改密码\n请输入您的手机号和验证码吧',  
43 - style: TextStyle(  
44 - fontSize: 16.5,  
45 - color: Color(0xFF666666) 35 + builder: (context, state) {
  36 + final bloc = BlocProvider.of<ForgetPwdHomeBloc>(context);
  37 + return Scaffold(
  38 + body: Container(
  39 + color: Colors.white,
  40 + child: SafeArea(
  41 + child: ListView(
  42 + children: [
  43 + Padding(
  44 + padding: EdgeInsets.only(left: 49.w,right: 10.w),
  45 + child: Column(
  46 + children: [
  47 + 34.verticalSpace,
  48 + Row(
  49 + children: [
  50 + Image.asset(
  51 + 'wow_logo'.assetPng,
  52 + height: 49.w,
  53 + width: 83.5.h,
46 ), 54 ),
47 - )  
48 - ],  
49 - ),  
50 - Row(  
51 - crossAxisAlignment: CrossAxisAlignment.start,  
52 - children: [  
53 - Expanded(  
54 - child: Column(  
55 - children: [  
56 - 44.5.verticalSpace,  
57 - Row(  
58 - children: [  
59 - Image.asset(  
60 - 'phone'.assetPng,  
61 - height: 45.h,  
62 - width: 35.w,  
63 - ),  
64 - 15.horizontalSpace,  
65 - Expanded(  
66 - child: TextFieldCustomerWidget(  
67 - height: 50.h,  
68 - hitText: '请输入当前手机号',  
69 - textInputType: TextInputType.phone,  
70 - bgImageName: 'Input_layer_up',  
71 - onChangeValue: (String value) {  
72 - bloc.add(PhoneNumChangeEvent());  
73 - },  
74 - controller: bloc.phoneNumController,  
75 - )  
76 - )  
77 - ],  
78 - ),  
79 - 11.5.verticalSpace,  
80 - Row(  
81 - mainAxisAlignment: MainAxisAlignment.spaceBetween,  
82 - children: [  
83 - Image.asset(  
84 - 'lock'.assetPng,  
85 - height: 34.h,  
86 - width: 31.w,  
87 - ),  
88 - 18.5.horizontalSpace,  
89 - Expanded(  
90 - child: TextFieldCustomerWidget(  
91 - hitText: '请输入验证码',  
92 - bgImageName: 'Input_layer_down',  
93 - onChangeValue: (String value) {  
94 - bloc.add(CheckCodeChangeEvent());  
95 - },  
96 - textInputType: TextInputType.emailAddress,  
97 - controller: bloc.checkNumController,  
98 - )  
99 - ),  
100 - 16.5.horizontalSpace,  
101 - GestureDetector(  
102 - onTap: () {  
103 - if (bloc.canSendSms) {  
104 - bloc.add(SendSmsCodeEvent());  
105 - }  
106 - },  
107 - child: Container(  
108 - decoration: BoxDecoration(  
109 - image: DecorationImage(  
110 - image: AssetImage(  
111 - bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng  
112 - ),  
113 - fit: BoxFit.fill 55 + 12.5.horizontalSpace,
  56 + const Text(
  57 + '修改密码\n请输入您的手机号和验证码吧',
  58 + style: TextStyle(
  59 + fontSize: 16.5,
  60 + color: Color(0xFF666666)
  61 + ),
  62 + )
  63 + ],
  64 + ),
  65 + Row(
  66 + crossAxisAlignment: CrossAxisAlignment.start,
  67 + children: [
  68 + Expanded(
  69 + child: Column(
  70 + children: [
  71 + 44.5.verticalSpace,
  72 + Row(
  73 + children: [
  74 + Image.asset(
  75 + 'phone'.assetPng,
  76 + height: 45.h,
  77 + width: 35.w,
  78 + ),
  79 + 15.horizontalSpace,
  80 + Expanded(
  81 + child: TextFieldCustomerWidget(
  82 + height: 50.h,
  83 + hitText: '请输入当前手机号',
  84 + textInputType: TextInputType.phone,
  85 + bgImageName: 'Input_layer_up',
  86 + onChangeValue: (String value) {
  87 + bloc.add(PhoneNumChangeEvent());
  88 + },
  89 + controller: bloc.phoneNumController,
  90 + )
  91 + )
  92 + ],
  93 + ),
  94 + 11.5.verticalSpace,
  95 + Row(
  96 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
  97 + children: [
  98 + Image.asset(
  99 + 'lock'.assetPng,
  100 + height: 34.h,
  101 + width: 31.w,
  102 + ),
  103 + 18.5.horizontalSpace,
  104 + Expanded(
  105 + child: TextFieldCustomerWidget(
  106 + hitText: '请输入验证码',
  107 + bgImageName: 'Input_layer_down',
  108 + onChangeValue: (String value) {
  109 + bloc.add(CheckCodeChangeEvent());
  110 + },
  111 + textInputType: TextInputType.emailAddress,
  112 + controller: bloc.checkNumController,
  113 + )
  114 + ),
  115 + 16.5.horizontalSpace,
  116 + GestureDetector(
  117 + onTap: () {
  118 + if (bloc.canSendSms) {
  119 + bloc.add(SendSmsCodeEvent());
  120 + }
  121 + },
  122 + child: Container(
  123 + decoration: BoxDecoration(
  124 + image: DecorationImage(
  125 + image: AssetImage(
  126 + bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng
  127 + ),
  128 + fit: BoxFit.fill
  129 + ),
114 ), 130 ),
115 - ),  
116 - padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0),  
117 - child: const Text( 131 + padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0),
  132 + child: const Text(
118 '获取验证码', 133 '获取验证码',
119 - style: TextStyle(  
120 - fontSize: 16,  
121 - color: Colors.white 134 + style: TextStyle(
  135 + fontSize: 16,
  136 + color: Colors.white
  137 + ),
122 ), 138 ),
123 ), 139 ),
124 - ),  
125 - )  
126 - ],  
127 - )  
128 - ],  
129 - )  
130 - ),  
131 - 2.verticalSpace,  
132 - Image.asset(  
133 - 'steven_bride'.assetPng,  
134 - height: 173.h,  
135 - width: 157.w,  
136 - )  
137 - ],  
138 - ),  
139 - GestureDetector(  
140 - onTap: () {  
141 - if (bloc.canSetPwd) {  
142 - bloc.add(SetPassWordEvent());  
143 - }  
144 - },  
145 - child: Container(  
146 - decoration: BoxDecoration(  
147 - image: DecorationImage(  
148 - image: AssetImage(  
149 - bloc.canSetPwd?'login_enter'.assetPng:'login_enter_dis'.assetPng  
150 - ),  
151 - fit: BoxFit.fill 140 + )
  141 + ],
  142 + )
  143 + ],
  144 + )
152 ), 145 ),
153 - ),  
154 - padding: const EdgeInsets.symmetric(  
155 - horizontal: 28.0,  
156 - vertical: 14.0  
157 - ),  
158 - child:const Text(  
159 - '确定',  
160 - style: TextStyle(  
161 - fontSize: 16 146 + 2.verticalSpace,
  147 + Image.asset(
  148 + 'steven_bride'.assetPng,
  149 + height: 173.h,
  150 + width: 157.w,
  151 + )
  152 + ],
  153 + ),
  154 + GestureDetector(
  155 + onTap: () {
  156 + if (bloc.canSetPwd) {
  157 + bloc.add(SetPassWordEvent());
  158 + }
  159 + },
  160 + child: Container(
  161 + decoration: BoxDecoration(
  162 + image: DecorationImage(
  163 + image: AssetImage(
  164 + bloc.canSetPwd?'login_enter'.assetPng:'login_enter_dis'.assetPng
  165 + ),
  166 + fit: BoxFit.fill
  167 + ),
  168 + ),
  169 + padding: const EdgeInsets.symmetric(
  170 + horizontal: 28.0,
  171 + vertical: 14.0
  172 + ),
  173 + child:const Text(
  174 + '确定',
  175 + style: TextStyle(
  176 + fontSize: 16
  177 + ),
162 ), 178 ),
163 ), 179 ),
164 - ),  
165 - )  
166 - ],  
167 - ),  
168 - )  
169 - ], 180 + )
  181 + ],
  182 + ),
  183 + )
  184 + ],
  185 + ),
170 ), 186 ),
171 ), 187 ),
172 - ),  
173 - );  
174 - } 188 + );
  189 + }
175 ); 190 );
176 } 191 }
177 \ No newline at end of file 192 \ No newline at end of file
lib/login/loginpage/bloc/login_bloc.dart
@@ -16,15 +16,11 @@ class LoginBloc extends Bloc&lt;LoginEvent, LoginState&gt; { @@ -16,15 +16,11 @@ class LoginBloc extends Bloc&lt;LoginEvent, LoginState&gt; {
16 bool _canLogin = false; 16 bool _canLogin = false;
17 ///是否可以发送验证码 17 ///是否可以发送验证码
18 bool _canSendSms = false; 18 bool _canSendSms = false;
19 - ///正在发送验证码  
20 - bool _sendSmsIng = false;  
21 ///是否阅读协议 19 ///是否阅读协议
22 bool _agreement = false; 20 bool _agreement = false;
23 ///登陆方式 21 ///登陆方式
24 LoginType _loginType = LoginType.sms; 22 LoginType _loginType = LoginType.sms;
25 23
26 - int _countDown = 0;  
27 -  
28 final TextEditingController phoneNumController = TextEditingController(); 24 final TextEditingController phoneNumController = TextEditingController();
29 final TextEditingController checkNumController = TextEditingController(); 25 final TextEditingController checkNumController = TextEditingController();
30 26
@@ -32,21 +28,19 @@ class LoginBloc extends Bloc&lt;LoginEvent, LoginState&gt; { @@ -32,21 +28,19 @@ class LoginBloc extends Bloc&lt;LoginEvent, LoginState&gt; {
32 bool get agreement => _agreement; 28 bool get agreement => _agreement;
33 LoginType get loginType => _loginType; 29 LoginType get loginType => _loginType;
34 bool get canSendSms => _canSendSms; 30 bool get canSendSms => _canSendSms;
35 - bool get sendSmsIng => _sendSmsIng;  
36 31
37 LoginBloc() : super(LoginInitial()) { 32 LoginBloc() : super(LoginInitial()) {
38 on<RequestLoginEvent>(_requestLoginApi); 33 on<RequestLoginEvent>(_requestLoginApi);
39 on<ChangeLoginTypeEvent>(_changeLoginType); 34 on<ChangeLoginTypeEvent>(_changeLoginType);
40 on<PhoneNumChangeEvent>(_changePhoneNumber); 35 on<PhoneNumChangeEvent>(_changePhoneNumber);
41 on<AgreementChangeEvent>(_agreementTypeChange); 36 on<AgreementChangeEvent>(_agreementTypeChange);
42 - on<ForgetPasswordEvent>(_forgetPassword);  
43 on<CheckFieldChangeEvent>(_checkFiledChange); 37 on<CheckFieldChangeEvent>(_checkFiledChange);
44 } 38 }
45 39
46 40
47 ///请求登陆 41 ///请求登陆
48 void _requestLoginApi(RequestLoginEvent event, Emitter<LoginState> emitter) async { 42 void _requestLoginApi(RequestLoginEvent event, Emitter<LoginState> emitter) async {
49 - 43 + emitter(LoginResultChangeState());
50 } 44 }
51 45
52 ///切换登陆方式 46 ///切换登陆方式
@@ -100,11 +94,6 @@ class LoginBloc extends Bloc&lt;LoginEvent, LoginState&gt; { @@ -100,11 +94,6 @@ class LoginBloc extends Bloc&lt;LoginEvent, LoginState&gt; {
100 } 94 }
101 } 95 }
102 96
103 - ///忘记密码  
104 - void _forgetPassword(ForgetPasswordEvent event, Emitter<LoginState> emitter) async {  
105 -  
106 - }  
107 -  
108 ///登陆状态判断 97 ///登陆状态判断
109 bool _loginStateChange() { 98 bool _loginStateChange() {
110 if (_agreement) { 99 if (_agreement) {
lib/login/loginpage/bloc/login_event.dart
@@ -2,19 +2,13 @@ part of &#39;login_bloc.dart&#39;; @@ -2,19 +2,13 @@ part of &#39;login_bloc.dart&#39;;
2 2
3 @immutable 3 @immutable
4 abstract class LoginEvent {} 4 abstract class LoginEvent {}
5 -  
6 -class RequestLoginEvent extends LoginEvent {}  
7 - 5 +///切换登陆方式
8 class ChangeLoginTypeEvent extends LoginEvent {} 6 class ChangeLoginTypeEvent extends LoginEvent {}
9 - 7 +///输入手机号
10 class PhoneNumChangeEvent extends LoginEvent {} 8 class PhoneNumChangeEvent extends LoginEvent {}
11 - 9 +///输入验证码/密码
12 class CheckFieldChangeEvent extends LoginEvent {} 10 class CheckFieldChangeEvent extends LoginEvent {}
13 - 11 +///隐私协议点击
14 class AgreementChangeEvent extends LoginEvent {} 12 class AgreementChangeEvent extends LoginEvent {}
15 -  
16 -class ForgetPasswordEvent extends LoginEvent {}  
17 -  
18 -class CountDownEvent extends LoginEvent {}  
19 -  
20 -class CancelCountDownEvent extends LoginEvent {} 13 +///请求登陆
  14 +class RequestLoginEvent extends LoginEvent {}
lib/login/loginpage/bloc/login_state.dart
@@ -4,13 +4,13 @@ part of &#39;login_bloc.dart&#39;; @@ -4,13 +4,13 @@ part of &#39;login_bloc.dart&#39;;
4 abstract class LoginState {} 4 abstract class LoginState {}
5 5
6 class LoginInitial extends LoginState {} 6 class LoginInitial extends LoginState {}
7 - 7 +///登陆按钮状态
8 class LoginEventChangeState extends LoginState {} 8 class LoginEventChangeState extends LoginState {}
9 - 9 +///切换登陆方式
10 class LoginTypeChangeState extends LoginState {} 10 class LoginTypeChangeState extends LoginState {}
11 - 11 +///发送验证码按钮状态
12 class SmsSendTypeChangeState extends LoginState {} 12 class SmsSendTypeChangeState extends LoginState {}
13 - 13 +///是否同意协议
14 class AgreementTypeChangeState extends LoginState {} 14 class AgreementTypeChangeState extends LoginState {}
15 -  
16 -class CountDownNumChangeState extends LoginState {} 15 +///登陆请求结果
  16 +class LoginResultChangeState extends LoginState {}
lib/login/loginpage/login_page.dart
1 import 'package:flutter/gestures.dart'; 1 import 'package:flutter/gestures.dart';
2 import 'package:flutter/material.dart'; 2 import 'package:flutter/material.dart';
3 import 'package:flutter_bloc/flutter_bloc.dart'; 3 import 'package:flutter_bloc/flutter_bloc.dart';
  4 +import 'package:flutter_easyloading/flutter_easyloading.dart';
4 import 'package:flutter_screenutil/flutter_screenutil.dart'; 5 import 'package:flutter_screenutil/flutter_screenutil.dart';
5 import 'package:wow_english/common/extension/string_extension.dart'; 6 import 'package:wow_english/common/extension/string_extension.dart';
6 import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; 7 import 'package:wow_english/common/widgets/textfield_customer_widget.dart';
@@ -15,6 +16,20 @@ class LoginPage extends StatelessWidget { @@ -15,6 +16,20 @@ class LoginPage extends StatelessWidget {
15 Widget build(BuildContext context) { 16 Widget build(BuildContext context) {
16 return BlocProvider( 17 return BlocProvider(
17 create: (context) => LoginBloc(), 18 create: (context) => LoginBloc(),
  19 + child: _LoginPageView(),
  20 + );
  21 + }
  22 +}
  23 +
  24 +class _LoginPageView extends StatelessWidget {
  25 + @override
  26 + Widget build(BuildContext context) {
  27 + return BlocListener<LoginBloc,LoginState>(
  28 + listener: (context, state){
  29 + if (state is LoginResultChangeState) {
  30 + EasyLoading.showToast('登陆接口回调');
  31 + }
  32 + },
18 child: _buildLoginViewWidget(), 33 child: _buildLoginViewWidget(),
19 ); 34 );
20 } 35 }
lib/login/loginpage/time_widget.dart
@@ -4,57 +4,62 @@ import &#39;package:wow_english/common/blocs/timerbloc/timer_bloc.dart&#39;; @@ -4,57 +4,62 @@ import &#39;package:wow_english/common/blocs/timerbloc/timer_bloc.dart&#39;;
4 import 'package:wow_english/common/extension/string_extension.dart'; 4 import 'package:wow_english/common/extension/string_extension.dart';
5 import 'package:wow_english/common/widgets/timer_ticker.dart'; 5 import 'package:wow_english/common/widgets/timer_ticker.dart';
6 6
7 -class TimerWidget extends StatefulWidget { 7 +class TimerWidget extends StatelessWidget {
8 const TimerWidget({super.key, required this.canSendSms}); 8 const TimerWidget({super.key, required this.canSendSms});
9 9
10 final bool canSendSms; 10 final bool canSendSms;
11 11
12 @override 12 @override
13 - State<StatefulWidget> createState() {  
14 - return _TimerWidgetState(); 13 + Widget build(BuildContext context) {
  14 + return BlocProvider(
  15 + create: (_) => TimerBloc(ticker: const TimerTicker()),
  16 + child: TimerWidgetView(canSendSms: canSendSms,),
  17 + );
15 } 18 }
16 } 19 }
17 20
18 -class _TimerWidgetState extends State<TimerWidget> {  
19 - late bool sendSmsIng; 21 +class TimerWidgetView extends StatelessWidget {
  22 +
  23 + final bool canSendSms;
  24 +
  25 + const TimerWidgetView({super.key, required this.canSendSms});
20 26
21 - @override  
22 - void initState() {  
23 - super.initState();  
24 - sendSmsIng = false;  
25 - }  
26 27
27 @override 28 @override
28 Widget build(BuildContext context) { 29 Widget build(BuildContext context) {
29 - return BlocProvider(  
30 - create: (_) => TimerBloc(ticker: const TimerTicker()),  
31 - child: _buildCountdownWidget(), 30 + bool sendSmsIng = false;
  31 + return BlocListener<TimerBloc,TimerState>(
  32 + listener: (context, s) {
  33 + if (s is RunningState) {
  34 + sendSmsIng = true;
  35 + } if (s is FinishedState) {
  36 + sendSmsIng = false;
  37 + context.read<TimerBloc>().add(ResetEvent());
  38 + } else {
  39 + sendSmsIng = false;
  40 + }
  41 + },
  42 + child: _buildCountdownWidget(sendSmsIng:sendSmsIng),
32 ); 43 );
33 } 44 }
34 45
35 - Widget _buildCountdownWidget() => BlocBuilder<TimerBloc,TimerState>( 46 + Widget _buildCountdownWidget({required bool sendSmsIng}) => BlocBuilder<TimerBloc,TimerState>(
36 buildWhen: (prev, state) => prev.runtimeType != state.runtimeType, 47 buildWhen: (prev, state) => prev.runtimeType != state.runtimeType,
37 builder: (context,state) { 48 builder: (context,state) {
38 final bloc = BlocProvider.of<TimerBloc>(context); 49 final bloc = BlocProvider.of<TimerBloc>(context);
39 final duration = bloc.state.duration; 50 final duration = bloc.state.duration;
40 final secondsStr = (duration % 60).floor().toString().padLeft(2, '0'); 51 final secondsStr = (duration % 60).floor().toString().padLeft(2, '0');
41 - if (state is TimerInitial) {  
42 - sendSmsIng = true;  
43 - } else {  
44 - sendSmsIng = false;  
45 - }  
46 return GestureDetector( 52 return GestureDetector(
47 onTap: () { 53 onTap: () {
48 - if (widget.canSendSms && !sendSmsIng) { 54 + if (canSendSms && !sendSmsIng) {
49 bloc.add(ResetEvent()); 55 bloc.add(ResetEvent());
50 - bloc.add(StartEvent(duration: bloc.state.duration));  
51 } 56 }
52 }, 57 },
53 child: Container( 58 child: Container(
54 decoration: BoxDecoration( 59 decoration: BoxDecoration(
55 image: DecorationImage( 60 image: DecorationImage(
56 image: AssetImage( 61 image: AssetImage(
57 - widget.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng 62 + canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng
58 ), 63 ),
59 fit: BoxFit.fill 64 fit: BoxFit.fill
60 ), 65 ),
lib/login/setpwd/bloc/set_pwd_bloc.dart
@@ -6,6 +6,8 @@ part &#39;set_pwd_state.dart&#39;; @@ -6,6 +6,8 @@ part &#39;set_pwd_state.dart&#39;;
6 6
7 class SetPwdBloc extends Bloc<SetPwdEvent, SetPwdState> { 7 class SetPwdBloc extends Bloc<SetPwdEvent, SetPwdState> {
8 8
  9 + final String? phoneNumber;
  10 +
9 final TextEditingController passWordFirstController = TextEditingController(); 11 final TextEditingController passWordFirstController = TextEditingController();
10 final TextEditingController passWordSecondController = TextEditingController(); 12 final TextEditingController passWordSecondController = TextEditingController();
11 ///密码是否符合规则(第一个输入框) 13 ///密码是否符合规则(第一个输入框)
@@ -31,7 +33,7 @@ class SetPwdBloc extends Bloc&lt;SetPwdEvent, SetPwdState&gt; { @@ -31,7 +33,7 @@ class SetPwdBloc extends Bloc&lt;SetPwdEvent, SetPwdState&gt; {
31 33
32 bool get ensure => _passwordCheck && _passwordEnsure; 34 bool get ensure => _passwordCheck && _passwordEnsure;
33 35
34 - SetPwdBloc() : super(SetPwdInitial()) { 36 + SetPwdBloc(this.phoneNumber) : super(SetPwdInitial()) {
35 on<PwdEnsureEvent>(_pwdEnsureTextChange); 37 on<PwdEnsureEvent>(_pwdEnsureTextChange);
36 on<PwdCheckEvent>(_pwdCheckTextChange); 38 on<PwdCheckEvent>(_pwdCheckTextChange);
37 on<SetPasswordEvent>(_setPassword); 39 on<SetPasswordEvent>(_setPassword);
@@ -114,6 +116,6 @@ class SetPwdBloc extends Bloc&lt;SetPwdEvent, SetPwdState&gt; { @@ -114,6 +116,6 @@ class SetPwdBloc extends Bloc&lt;SetPwdEvent, SetPwdState&gt; {
114 } 116 }
115 117
116 void _setPassword(SetPasswordEvent event,Emitter<SetPwdState> emitter) async { 118 void _setPassword(SetPasswordEvent event,Emitter<SetPwdState> emitter) async {
117 - 119 + emitter(PasswordSetSuccessState());
118 } 120 }
119 } 121 }
lib/login/setpwd/bloc/set_pwd_state.dart
@@ -14,3 +14,5 @@ class PasswordLargeState extends SetPwdState {} @@ -14,3 +14,5 @@ class PasswordLargeState extends SetPwdState {}
14 class PasswordIconShowState extends SetPwdState {} 14 class PasswordIconShowState extends SetPwdState {}
15 15
16 class PasswordCheckIconShowState extends SetPwdState {} 16 class PasswordCheckIconShowState extends SetPwdState {}
  17 +
  18 +class PasswordSetSuccessState extends SetPwdState {}
lib/login/setpwd/set_pwd_page.dart
@@ -3,6 +3,7 @@ import &#39;package:flutter_bloc/flutter_bloc.dart&#39;; @@ -3,6 +3,7 @@ import &#39;package:flutter_bloc/flutter_bloc.dart&#39;;
3 import 'package:flutter_screenutil/flutter_screenutil.dart'; 3 import 'package:flutter_screenutil/flutter_screenutil.dart';
4 import 'package:wow_english/common/extension/string_extension.dart'; 4 import 'package:wow_english/common/extension/string_extension.dart';
5 import 'package:wow_english/login/setpwd/bloc/set_pwd_bloc.dart'; 5 import 'package:wow_english/login/setpwd/bloc/set_pwd_bloc.dart';
  6 +import 'package:wow_english/route/route.dart';
6 7
7 import '../../common/widgets/textfield_customer_widget.dart'; 8 import '../../common/widgets/textfield_customer_widget.dart';
8 9
@@ -13,7 +14,21 @@ class SetPassWordPage extends StatelessWidget { @@ -13,7 +14,21 @@ class SetPassWordPage extends StatelessWidget {
13 @override 14 @override
14 Widget build(BuildContext context) { 15 Widget build(BuildContext context) {
15 return BlocProvider( 16 return BlocProvider(
16 - create: (context) => SetPwdBloc(), 17 + create: (context) => SetPwdBloc(phoneNum),
  18 + child: _SetPassWordPageView(),
  19 + );
  20 + }
  21 +}
  22 +
  23 +class _SetPassWordPageView extends StatelessWidget {
  24 + @override
  25 + Widget build(BuildContext context) {
  26 + return BlocListener<SetPwdBloc, SetPwdState>(
  27 + listener: (context, s){
  28 + if (s is PasswordSetSuccessState) {
  29 + Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false);
  30 + }
  31 + },
17 child: _buildSetPwdView(), 32 child: _buildSetPwdView(),
18 ); 33 );
19 } 34 }
@@ -129,6 +144,7 @@ class SetPassWordPage extends StatelessWidget { @@ -129,6 +144,7 @@ class SetPassWordPage extends StatelessWidget {
129 if (!bloc.ensure) { 144 if (!bloc.ensure) {
130 return; 145 return;
131 } 146 }
  147 + bloc.add(SetPasswordEvent());
132 }, 148 },
133 child: Container( 149 child: Container(
134 decoration: BoxDecoration( 150 decoration: BoxDecoration(