Commit e1f365548c0ee1cb18b58e9ac8f77823de86493b
1 parent
17a80689
feat:调整状态监听逻辑
Showing
11 changed files
with
249 additions
and
203 deletions
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 'forget_pwd_home_bloc.dart'; | @@ -4,7 +4,9 @@ part of 'forget_pwd_home_bloc.dart'; | ||
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 'package:flutter_screenutil/flutter_screenutil.dart'; | @@ -4,6 +4,7 @@ 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/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<LoginEvent, LoginState> { | @@ -16,15 +16,11 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> { | ||
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<LoginEvent, LoginState> { | @@ -32,21 +28,19 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> { | ||
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<LoginEvent, LoginState> { | @@ -100,11 +94,6 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> { | ||
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 'login_bloc.dart'; | @@ -2,19 +2,13 @@ part of 'login_bloc.dart'; | ||
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 'login_bloc.dart'; | @@ -4,13 +4,13 @@ part of 'login_bloc.dart'; | ||
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 'package:wow_english/common/blocs/timerbloc/timer_bloc.dart'; | @@ -4,57 +4,62 @@ import 'package:wow_english/common/blocs/timerbloc/timer_bloc.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/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 'set_pwd_state.dart'; | @@ -6,6 +6,8 @@ part 'set_pwd_state.dart'; | ||
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<SetPwdEvent, SetPwdState> { | @@ -31,7 +33,7 @@ class SetPwdBloc extends Bloc<SetPwdEvent, SetPwdState> { | ||
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<SetPwdEvent, SetPwdState> { | @@ -114,6 +116,6 @@ class SetPwdBloc extends Bloc<SetPwdEvent, SetPwdState> { | ||
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 'package:flutter_bloc/flutter_bloc.dart'; | @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | ||
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( |