Commit 05f9b20a5fb7fb5f685592dd1614f178638da8d3
1 parent
fcc3a982
fixed: api调用方式,未完善
Showing
13 changed files
with
208 additions
and
265 deletions
lib/app/app.dart
... | ... | @@ -16,9 +16,9 @@ class App extends StatelessWidget { |
16 | 16 | Widget build(BuildContext context) { |
17 | 17 | return ScreenUtilInit( |
18 | 18 | designSize: const Size(667, 375), |
19 | - builder: (_,__) => MultiBlocProvider( | |
19 | + builder: (_, __) => MultiBlocProvider( | |
20 | 20 | providers: [ |
21 | - BlocProvider<TabBloc>(create: (_)=> TabBloc()), | |
21 | + BlocProvider<TabBloc>(create: (_) => TabBloc()), | |
22 | 22 | BlocProvider<CacheBloc>(create: (_) => CacheBloc()) |
23 | 23 | ], |
24 | 24 | child: HideKeyboard( |
... | ... | @@ -30,16 +30,13 @@ class App extends StatelessWidget { |
30 | 30 | useMaterial3: true, |
31 | 31 | ), |
32 | 32 | builder: EasyLoading.init( |
33 | - builder: (context,child) => ResponsiveBreakpoints( | |
34 | - breakpoints: const [ | |
35 | - Breakpoint(start: 0, end: 450, name: MOBILE), | |
36 | - Breakpoint(start: 0, end: 450, name: PHONE), | |
37 | - Breakpoint(start: 451, end: 800, name: TABLET), | |
38 | - Breakpoint(start: 801, end: 1920, name: DESKTOP), | |
39 | - Breakpoint(start: 1921, end: double.infinity, name: '4K'), | |
40 | - ], | |
41 | - child: child!) | |
42 | - ), | |
33 | + builder: (context, child) => ResponsiveBreakpoints(breakpoints: const [ | |
34 | + Breakpoint(start: 0, end: 450, name: MOBILE), | |
35 | + Breakpoint(start: 0, end: 450, name: PHONE), | |
36 | + Breakpoint(start: 451, end: 800, name: TABLET), | |
37 | + Breakpoint(start: 801, end: 1920, name: DESKTOP), | |
38 | + Breakpoint(start: 1921, end: double.infinity, name: '4K'), | |
39 | + ], child: child!)), | |
43 | 40 | initialRoute: AppRouteName.splash, |
44 | 41 | navigatorKey: AppRouter.navigatorKey, |
45 | 42 | onGenerateRoute: AppRouter.generateRoute, | ... | ... |
lib/common/request/api_response/api_response_entity.g.dart
... | ... | @@ -16,7 +16,7 @@ ApiResponse<T> $ApiResponseFromJson<T>(Map<String, dynamic> json) { |
16 | 16 | String type = T.toString(); |
17 | 17 | T? data; |
18 | 18 | if (kDebugMode) { |
19 | - print("type:$type"); | |
19 | + print("ApiResponse <T> type:$type"); | |
20 | 20 | } |
21 | 21 | if (json['data'] != null) { |
22 | 22 | data = jsonConvert.convert<T>(json['data']); | ... | ... |
lib/common/request/config.dart
lib/common/request/dao/user_dao.dart
1 | -import '../../../models/user_entity.dart'; | |
2 | -import '../api_response/api_response_entity.dart'; | |
1 | +import 'package:wow_english/models/user_entity.dart'; | |
2 | + | |
3 | 3 | import '../apis.dart'; |
4 | -import '../exception.dart'; | |
5 | 4 | import '../request_client.dart'; |
6 | 5 | |
7 | 6 | class UserDao { |
8 | - static loginByPassword( | |
9 | - phoneNumber, | |
10 | - password, | |
11 | - Function(ApiResponse<UserEntity>)? onResponse, | |
12 | - bool Function(ApiException)? onError, | |
13 | - ) async { | |
14 | - /*await DioUtil().requestData( | |
15 | - HttpMethod.post, | |
16 | - Api.login, | |
17 | - data: { | |
18 | - 'phoneNum':phoneNumber, | |
19 | - 'type':'pwd', | |
20 | - 'password':password}, | |
21 | - successCallBack: (data){ | |
22 | - emitter(LoginResultChangeState(true)); | |
23 | - }, | |
24 | - errorCallBack: (error){ | |
25 | - emitter(LoginResultChangeState(false)); | |
26 | - });*/ | |
27 | - var params = {'phoneNum': phoneNumber, 'type': 'pwd', 'password': password}; | |
28 | - await requestClient.post(Apis.login, data: params, onResponse: onResponse, onError: onError); | |
7 | + static Future<UserEntity?> login(phoneNumber, type, checkKey, checkNumber) { | |
8 | + var params = {'phoneNum': phoneNumber, 'type': type, checkKey: checkNumber}; | |
9 | + var data = requestClient.post<UserEntity>( | |
10 | + Apis.login, | |
11 | + data: params, | |
12 | + ); | |
13 | + return data; | |
29 | 14 | } |
30 | - | |
31 | - static loginBySmsCode(phoneNumber, smsCode) {} | |
32 | 15 | } | ... | ... |
lib/common/request/exception.dart
1 | 1 | import 'package:dio/dio.dart'; |
2 | +import 'package:flutter/foundation.dart'; | |
3 | + | |
2 | 4 | import 'api_response/api_response_entity.dart'; |
3 | 5 | |
4 | 6 | class ApiException implements Exception { |
... | ... | @@ -57,7 +59,11 @@ class ApiException implements Exception { |
57 | 59 | return ApiException(errCode, error.response?.statusMessage ?? '未知错误'); |
58 | 60 | } |
59 | 61 | } on Exception catch (e) { |
60 | - return ApiException(-1, unknownException); | |
62 | + if (kDebugMode) { | |
63 | + return ApiException(-1, e.toString()); | |
64 | + } else { | |
65 | + return ApiException(-1, unknownException); | |
66 | + } | |
61 | 67 | } |
62 | 68 | default: |
63 | 69 | return ApiException(-1, error.message); | ... | ... |
lib/common/request/exception_handler.dart
... | ... | @@ -2,9 +2,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; |
2 | 2 | |
3 | 3 | import 'exception.dart'; |
4 | 4 | |
5 | - | |
6 | -bool handleException(ApiException exception, | |
7 | - {bool Function(ApiException)? onError}) { | |
5 | +bool handleException(ApiException exception, {bool Function(ApiException)? onError}) { | |
8 | 6 | if (onError?.call(exception) == true) { |
9 | 7 | return true; |
10 | 8 | } |
... | ... | @@ -14,6 +12,5 @@ bool handleException(ApiException exception, |
14 | 12 | return true; |
15 | 13 | } |
16 | 14 | EasyLoading.showError(exception.message ?? ApiException.unknownException); |
17 | - | |
18 | 15 | return false; |
19 | 16 | } | ... | ... |
lib/common/request/request.dart
... | ... | @@ -2,15 +2,17 @@ import '../../utils/loading.dart'; |
2 | 2 | import 'exception.dart'; |
3 | 3 | import 'exception_handler.dart'; |
4 | 4 | |
5 | -Future request( | |
5 | +Future<T?> request<T>( | |
6 | 6 | Function() block, { |
7 | - bool showLoading = true, | |
7 | + String loadingText = '加载中...', | |
8 | 8 | bool Function(ApiException)? onError, |
9 | 9 | }) async { |
10 | 10 | try { |
11 | - await loading(block, isShowLoading: showLoading); | |
11 | + return await loading(block, loadingText: loadingText); | |
12 | 12 | } catch (e) { |
13 | - handleException(ApiException.from(e), onError: onError); | |
13 | + if (!handleException(ApiException.from(e), onError: onError)) { | |
14 | + rethrow; | |
15 | + } | |
14 | 16 | } |
15 | - return; | |
17 | + return null; | |
16 | 18 | } | ... | ... |
lib/common/request/request_client.dart
... | ... | @@ -45,7 +45,6 @@ class RequestClient { |
45 | 45 | throw exception; |
46 | 46 | } |
47 | 47 | } |
48 | - | |
49 | 48 | return null; |
50 | 49 | } |
51 | 50 | |
... | ... | @@ -132,7 +131,6 @@ class RequestClient { |
132 | 131 | Function(ApiResponse<T>)? onResponse, |
133 | 132 | ) { |
134 | 133 | int statusCode = response.statusCode ?? -1; |
135 | - print('statusCode=$statusCode'); | |
136 | 134 | // 200..299 成功响应 |
137 | 135 | if (statusCode >= 200 && statusCode <= 299) { |
138 | 136 | if (T.toString() == (RawData).toString()) { | ... | ... |
lib/common/request/token_interceptor.dart
1 | 1 | import 'package:dio/dio.dart'; |
2 | +import 'package:wow_english/common/request/config.dart'; | |
2 | 3 | |
3 | 4 | class TokenInterceptor extends Interceptor { |
4 | 5 | @override |
5 | 6 | void onRequest(RequestOptions options, RequestInterceptorHandler handler) { |
6 | - /// todo 判断token不为空插入 | |
7 | - options.headers["Auth-token"] = ''; | |
7 | + // 判断token不为空插入, todo token的取法应该跟user在一起,这里取不到user | |
8 | + if (RequestConfig.token.isNotEmpty) { | |
9 | + options.headers["Auth-token"] = RequestConfig.token; | |
10 | + } | |
8 | 11 | options.headers["version"] = '1.0.0'; |
9 | 12 | super.onRequest(options, handler); |
10 | 13 | } | ... | ... |
lib/pages/login/loginpage/bloc/login_bloc.dart
1 | -import 'dart:js'; | |
2 | - | |
3 | 1 | import 'package:flutter/cupertino.dart'; |
4 | 2 | import 'package:flutter_bloc/flutter_bloc.dart'; |
5 | 3 | import 'package:flutter_easyloading/flutter_easyloading.dart'; |
6 | - | |
7 | -import '../../../../common/request/api_response/api_response_entity.dart'; | |
8 | -import '../../../../common/request/apis.dart'; | |
9 | -import '../../../../common/request/request.dart'; | |
10 | -import '../../../../common/request/request_client.dart'; | |
11 | -import '../../../../models/user_entity.dart'; | |
4 | +import 'package:wow_english/common/request/config.dart'; | |
5 | +import 'package:wow_english/common/request/dao/user_dao.dart'; | |
6 | +import 'package:wow_english/models/user_entity.dart'; | |
7 | +import 'package:wow_english/utils/loading.dart'; | |
12 | 8 | |
13 | 9 | part 'login_event.dart'; |
14 | 10 | part 'login_state.dart'; |
... | ... | @@ -73,29 +69,22 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> { |
73 | 69 | var checkKey = _isSmsLoginType ? 'smsCode' : 'password'; |
74 | 70 | var type = _isSmsLoginType ? 'sms_code' : 'pwd'; |
75 | 71 | |
76 | - request(() async { | |
77 | - var params = {'phoneNum': phoneNumber, 'type': type, checkKey: checkNumber}; | |
78 | - await requestClient.post( | |
79 | - Apis.login, | |
80 | - data: params, | |
81 | - onResponse: (ApiResponse<UserEntity> response) { | |
82 | - print('response=$response'); | |
83 | - // todo 持久化用户对象 | |
84 | - // todo 写入全局对象 | |
85 | - //emitter.call(LoginResultChangeState()); | |
86 | - }, | |
87 | - onError: (e) { | |
88 | - EasyLoading.showToast('登陆失败:${e.message}'); | |
89 | - return true; | |
90 | - }, | |
91 | - ); | |
92 | - }); | |
72 | + try { | |
73 | + await loading(() async { | |
74 | + var user = await UserDao.login(phoneNumber, type, checkKey, checkNumber); | |
75 | + print('login已执行'); | |
76 | + print('user=$user'); | |
77 | + RequestConfig.token = user!.token; | |
78 | + emitter.call(LoginResultChangeState(user)); | |
79 | + }); | |
80 | + } catch (e) { | |
81 | + print(e); | |
82 | + EasyLoading.showToast('登陆失败'); | |
83 | + } | |
93 | 84 | } |
94 | 85 | |
95 | 86 | ///请求验证码 |
96 | - void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter<LoginState> emitter) async { | |
97 | - | |
98 | - } | |
87 | + void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter<LoginState> emitter) async {} | |
99 | 88 | |
100 | 89 | ///切换登陆方式 |
101 | 90 | void _changeLoginType(ChangeLoginTypeEvent event, Emitter<LoginState> emitter) async { | ... | ... |
lib/pages/login/loginpage/bloc/login_state.dart
... | ... | @@ -16,8 +16,13 @@ class SmsSendTypeChangeState extends LoginState {} |
16 | 16 | |
17 | 17 | ///是否同意协议 |
18 | 18 | class AgreementTypeChangeState extends LoginState {} |
19 | + | |
19 | 20 | ///获取验证码 |
20 | -class SmsCodeRequestState extends LoginState {} | |
21 | +class SmsCodeRequestState extends LoginState {} | |
21 | 22 | |
22 | 23 | ///登陆请求结果 |
23 | -class LoginResultChangeState extends LoginState {} | |
24 | +class LoginResultChangeState extends LoginState { | |
25 | + final UserEntity userEntity; | |
26 | + | |
27 | + LoginResultChangeState(this.userEntity); | |
28 | +} | ... | ... |
lib/pages/login/loginpage/login_page.dart
... | ... | @@ -25,169 +25,139 @@ class LoginPage extends StatelessWidget { |
25 | 25 | class _LoginPageView extends StatelessWidget { |
26 | 26 | @override |
27 | 27 | Widget build(BuildContext context) { |
28 | - return BlocListener<LoginBloc,LoginState>( | |
29 | - listener: (context, state){ | |
30 | - if (state is LoginResultChangeState) { | |
31 | - Navigator.of(context).pushNamed(AppRouteName.home); | |
32 | - } | |
33 | - context.read<CacheBloc>().add(UserInfoChangeEvent(null)); | |
34 | - }, | |
28 | + return BlocListener<LoginBloc, LoginState>( | |
29 | + listener: (context, state) { | |
30 | + if (state is LoginResultChangeState) { | |
31 | + context.read<CacheBloc>().add(UserInfoChangeEvent(state.userEntity)); | |
32 | + Navigator.of(context).pushNamed(AppRouteName.home); | |
33 | + } | |
34 | + }, | |
35 | 35 | child: _buildLoginViewWidget(), |
36 | 36 | ); |
37 | 37 | } |
38 | 38 | |
39 | - Widget _buildLoginViewWidget() => BlocBuilder<LoginBloc,LoginState> ( | |
40 | - builder: (context, state) { | |
41 | - final bloc = BlocProvider.of<LoginBloc>(context); | |
42 | - return Scaffold( | |
43 | - body: SafeArea( | |
44 | - child: ListView( | |
45 | - children: [ | |
46 | - Container( | |
47 | - padding: EdgeInsets.only(top: 25.h), | |
48 | - child: Stack( | |
49 | - children: [ | |
50 | - Positioned( | |
51 | - right: 29.w, | |
52 | - child: GestureDetector( | |
53 | - onTap: () => bloc.add(ChangeLoginTypeEvent()), | |
54 | - child: Container( | |
55 | - decoration: BoxDecoration( | |
56 | - image: DecorationImage( | |
57 | - image: AssetImage( | |
58 | - 'login_logo'.assetPng | |
59 | - ), | |
60 | - fit: BoxFit.fill | |
61 | - ), | |
62 | - ), | |
63 | - padding: EdgeInsets.symmetric(horizontal: 18.w,vertical: 5.h), | |
64 | - child: Text( | |
65 | - bloc.isSmsLoginType?'密码登陆':'验证码密码', | |
66 | - style: TextStyle( | |
67 | - fontSize: 16.sp | |
39 | + Widget _buildLoginViewWidget() => BlocBuilder<LoginBloc, LoginState>( | |
40 | + builder: (context, state) { | |
41 | + final bloc = BlocProvider.of<LoginBloc>(context); | |
42 | + return Scaffold( | |
43 | + body: SafeArea( | |
44 | + child: ListView( | |
45 | + children: [ | |
46 | + Container( | |
47 | + padding: EdgeInsets.only(top: 25.h), | |
48 | + child: Stack( | |
49 | + children: [ | |
50 | + Positioned( | |
51 | + right: 29.w, | |
52 | + child: GestureDetector( | |
53 | + onTap: () => bloc.add(ChangeLoginTypeEvent()), | |
54 | + child: Container( | |
55 | + decoration: BoxDecoration( | |
56 | + image: DecorationImage(image: AssetImage('login_logo'.assetPng), fit: BoxFit.fill), | |
57 | + ), | |
58 | + padding: EdgeInsets.symmetric(horizontal: 18.w, vertical: 5.h), | |
59 | + child: Text( | |
60 | + bloc.isSmsLoginType ? '密码登陆' : '验证码密码', | |
61 | + style: TextStyle(fontSize: 16.sp), | |
62 | + ), | |
68 | 63 | ), |
69 | - ), | |
70 | - ), | |
71 | - ) | |
72 | - ), | |
73 | - Center( | |
74 | - child: Column( | |
75 | - children: [ | |
76 | - Image.asset( | |
77 | - 'wow_logo'.assetPng, | |
78 | - height: 81.h, | |
79 | - width: 131.w, | |
80 | - ), | |
81 | - Offstage( | |
82 | - offstage: !bloc.isSmsLoginType, | |
83 | - child: _buildSmsViewWidget(), | |
84 | - ), | |
85 | - Offstage( | |
86 | - offstage: bloc.isSmsLoginType, | |
87 | - child: _buildPwdViewWidget(), | |
88 | - ), | |
89 | - Row( | |
90 | - mainAxisAlignment: MainAxisAlignment.center, | |
64 | + )), | |
65 | + Center( | |
66 | + child: Column( | |
91 | 67 | children: [ |
92 | - GestureDetector( | |
93 | - onTap: () => bloc.add(AgreementChangeEvent()), | |
94 | - child: Icon( | |
95 | - bloc.agreement ? Icons.check_circle_outlined:Icons.circle_outlined, | |
96 | - color:bloc.agreement ? Colors.green:Colors.black), | |
68 | + Image.asset( | |
69 | + 'wow_logo'.assetPng, | |
70 | + height: 81.h, | |
71 | + width: 131.w, | |
72 | + ), | |
73 | + Offstage( | |
74 | + offstage: !bloc.isSmsLoginType, | |
75 | + child: _buildSmsViewWidget(), | |
97 | 76 | ), |
98 | - 6.horizontalSpace, | |
99 | - RichText( | |
100 | - text: TextSpan( | |
101 | - children:[ | |
77 | + Offstage( | |
78 | + offstage: bloc.isSmsLoginType, | |
79 | + child: _buildPwdViewWidget(), | |
80 | + ), | |
81 | + Row( | |
82 | + mainAxisAlignment: MainAxisAlignment.center, | |
83 | + children: [ | |
84 | + GestureDetector( | |
85 | + onTap: () => bloc.add(AgreementChangeEvent()), | |
86 | + child: Icon(bloc.agreement ? Icons.check_circle_outlined : Icons.circle_outlined, | |
87 | + color: bloc.agreement ? Colors.green : Colors.black), | |
88 | + ), | |
89 | + 6.horizontalSpace, | |
90 | + RichText( | |
91 | + text: TextSpan(children: [ | |
102 | 92 | TextSpan( |
103 | 93 | text: '我已阅读并同意', |
104 | 94 | style: TextStyle( |
105 | 95 | fontSize: 12.sp, |
106 | 96 | color: const Color(0xFF333333), |
107 | - ) | |
108 | - ), | |
97 | + )), | |
109 | 98 | TextSpan( |
110 | 99 | text: '《用户隐私协议》', |
111 | 100 | style: TextStyle( |
112 | 101 | fontSize: 12.sp, |
113 | 102 | color: const Color(0xFF333333), |
114 | 103 | ), |
115 | - recognizer: TapGestureRecognizer()..onTap = (){ | |
116 | - Navigator.of(context).pushNamed( | |
117 | - AppRouteName.webView, | |
118 | - arguments: { | |
119 | - 'urlStr':'https://www.zhihu.com', | |
120 | - 'webViewTitle':'用户隐私协议' | |
121 | - }); | |
122 | - }), | |
123 | - TextSpan( | |
124 | - text: ',', | |
125 | - style: TextStyle( | |
126 | - fontSize: 12.sp, | |
127 | - color: const Color(0xFF333333) | |
128 | - ) | |
129 | - ), | |
104 | + recognizer: TapGestureRecognizer() | |
105 | + ..onTap = () { | |
106 | + Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { | |
107 | + 'urlStr': 'https://www.zhihu.com', | |
108 | + 'webViewTitle': '用户隐私协议' | |
109 | + }); | |
110 | + }), | |
111 | + TextSpan( | |
112 | + text: ',', style: TextStyle(fontSize: 12.sp, color: const Color(0xFF333333))), | |
130 | 113 | TextSpan( |
131 | 114 | text: '《儿童隐私政策》', |
132 | - style: TextStyle( | |
133 | - fontSize: 12.sp, | |
134 | - color: const Color(0xFF333333) | |
135 | - ), | |
136 | - recognizer: TapGestureRecognizer()..onTap = (){ | |
137 | - Navigator.of(context).pushNamed( | |
138 | - AppRouteName.webView, | |
139 | - arguments: { | |
140 | - 'urlStr':'https://www.zhihu.com', | |
141 | - 'webViewTitle':'儿童隐私协议' | |
142 | - }); | |
143 | - }) | |
144 | - ] | |
115 | + style: TextStyle(fontSize: 12.sp, color: const Color(0xFF333333)), | |
116 | + recognizer: TapGestureRecognizer() | |
117 | + ..onTap = () { | |
118 | + Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { | |
119 | + 'urlStr': 'https://www.zhihu.com', | |
120 | + 'webViewTitle': '儿童隐私协议' | |
121 | + }); | |
122 | + }) | |
123 | + ]), | |
124 | + ) | |
125 | + ], | |
126 | + ), | |
127 | + GestureDetector( | |
128 | + onTap: () { | |
129 | + if (bloc.canLogin) { | |
130 | + bloc.add(RequestLoginEvent()); | |
131 | + } | |
132 | + }, | |
133 | + child: Container( | |
134 | + decoration: BoxDecoration( | |
135 | + image: DecorationImage( | |
136 | + image: AssetImage( | |
137 | + bloc.canLogin ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), | |
138 | + fit: BoxFit.fill), | |
139 | + ), | |
140 | + padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), | |
141 | + child: Text( | |
142 | + '登录', | |
143 | + style: TextStyle(fontSize: 16.sp), | |
144 | + ), | |
145 | 145 | ), |
146 | 146 | ) |
147 | 147 | ], |
148 | 148 | ), |
149 | - GestureDetector( | |
150 | - onTap: () { | |
151 | - if (bloc.canLogin) { | |
152 | - bloc.add(RequestLoginEvent()); | |
153 | - } | |
154 | - }, | |
155 | - child: Container( | |
156 | - decoration: BoxDecoration( | |
157 | - image: DecorationImage( | |
158 | - image: AssetImage( | |
159 | - bloc.canLogin?'login_enter'.assetPng:'login_enter_dis'.assetPng | |
160 | - ), | |
161 | - fit: BoxFit.fill | |
162 | - ), | |
163 | - ), | |
164 | - padding: EdgeInsets.symmetric( | |
165 | - horizontal: 28.w, | |
166 | - vertical: 14.h | |
167 | - ), | |
168 | - child: Text( | |
169 | - '登录', | |
170 | - style: TextStyle( | |
171 | - fontSize: 16.sp | |
172 | - ), | |
173 | - ), | |
174 | - ), | |
175 | - ) | |
176 | - ], | |
177 | - ), | |
178 | - ) | |
179 | - ], | |
180 | - ), | |
181 | - ) | |
182 | - ], | |
183 | - ), | |
184 | - ), | |
149 | + ) | |
150 | + ], | |
151 | + ), | |
152 | + ) | |
153 | + ], | |
154 | + ), | |
155 | + ), | |
156 | + ); | |
157 | + }, | |
185 | 158 | ); |
186 | - }, | |
187 | - ); | |
188 | 159 | |
189 | - Widget _buildSmsViewWidget()=> BlocBuilder<LoginBloc,LoginState>( | |
190 | - builder: (context,state) { | |
160 | + Widget _buildSmsViewWidget() => BlocBuilder<LoginBloc, LoginState>(builder: (context, state) { | |
191 | 161 | final bloc = BlocProvider.of<LoginBloc>(context); |
192 | 162 | return Padding( |
193 | 163 | padding: EdgeInsets.symmetric(horizontal: 135.w), |
... | ... | @@ -205,27 +175,25 @@ class _LoginPageView extends StatelessWidget { |
205 | 175 | controller: bloc.phoneNumController, |
206 | 176 | ), |
207 | 177 | 6.5.verticalSpace, |
208 | - Text('未注册用户登录默认注册', | |
209 | - style: TextStyle( | |
210 | - fontSize: 12.sp, | |
211 | - color: const Color(0xFF999999) | |
212 | - ),), | |
178 | + Text( | |
179 | + '未注册用户登录默认注册', | |
180 | + style: TextStyle(fontSize: 12.sp, color: const Color(0xFF999999)), | |
181 | + ), | |
213 | 182 | 4.5.verticalSpace, |
214 | 183 | Row( |
215 | 184 | mainAxisAlignment: MainAxisAlignment.spaceBetween, |
216 | 185 | children: [ |
217 | 186 | Expanded( |
218 | 187 | child: TextFieldCustomerWidget( |
219 | - height: 50.h, | |
220 | - hitText: '请输入验证码', | |
221 | - textInputType: TextInputType.number, | |
222 | - bgImageName: 'Input_layer_down', | |
223 | - onChangeValue: (String value) { | |
224 | - bloc.add(CheckFieldChangeEvent()); | |
225 | - }, | |
226 | - controller: bloc.checkNumController, | |
227 | - ) | |
228 | - ), | |
188 | + height: 50.h, | |
189 | + hitText: '请输入验证码', | |
190 | + textInputType: TextInputType.number, | |
191 | + bgImageName: 'Input_layer_down', | |
192 | + onChangeValue: (String value) { | |
193 | + bloc.add(CheckFieldChangeEvent()); | |
194 | + }, | |
195 | + controller: bloc.checkNumController, | |
196 | + )), | |
229 | 197 | TimerWidget(canSendSms: bloc.canSendSms) |
230 | 198 | ], |
231 | 199 | ) |
... | ... | @@ -234,8 +202,7 @@ class _LoginPageView extends StatelessWidget { |
234 | 202 | ); |
235 | 203 | }); |
236 | 204 | |
237 | - Widget _buildPwdViewWidget()=> BlocBuilder<LoginBloc,LoginState>( | |
238 | - builder: (context,state){ | |
205 | + Widget _buildPwdViewWidget() => BlocBuilder<LoginBloc, LoginState>(builder: (context, state) { | |
239 | 206 | final bloc = BlocProvider.of<LoginBloc>(context); |
240 | 207 | return Padding( |
241 | 208 | padding: EdgeInsets.symmetric(horizontal: 90.w), |
... | ... | @@ -253,16 +220,15 @@ class _LoginPageView extends StatelessWidget { |
253 | 220 | 10.5.horizontalSpace, |
254 | 221 | Expanded( |
255 | 222 | child: TextFieldCustomerWidget( |
256 | - height: 50.h, | |
257 | - hitText: '请输入手机号', | |
258 | - textInputType: TextInputType.phone, | |
259 | - bgImageName: 'Input_layer_up', | |
260 | - onChangeValue: (String value) { | |
261 | - bloc.add(PhoneNumChangeEvent()); | |
262 | - }, | |
263 | - controller: bloc.phoneNumController, | |
264 | - ) | |
265 | - ), | |
223 | + height: 50.h, | |
224 | + hitText: '请输入手机号', | |
225 | + textInputType: TextInputType.phone, | |
226 | + bgImageName: 'Input_layer_up', | |
227 | + onChangeValue: (String value) { | |
228 | + bloc.add(PhoneNumChangeEvent()); | |
229 | + }, | |
230 | + controller: bloc.phoneNumController, | |
231 | + )), | |
266 | 232 | 5.horizontalSpace, |
267 | 233 | SizedBox( |
268 | 234 | width: 100.w, |
... | ... | @@ -282,14 +248,13 @@ class _LoginPageView extends StatelessWidget { |
282 | 248 | 10.5.horizontalSpace, |
283 | 249 | Expanded( |
284 | 250 | child: TextFieldCustomerWidget( |
285 | - hitText: '请输入密码', | |
286 | - bgImageName: 'Input_layer_down', | |
287 | - onChangeValue: (String value) { | |
288 | - bloc.add(CheckFieldChangeEvent()); | |
289 | - }, | |
290 | - controller: bloc.checkNumController, | |
291 | - ) | |
292 | - ), | |
251 | + hitText: '请输入密码', | |
252 | + bgImageName: 'Input_layer_down', | |
253 | + onChangeValue: (String value) { | |
254 | + bloc.add(CheckFieldChangeEvent()); | |
255 | + }, | |
256 | + controller: bloc.checkNumController, | |
257 | + )), | |
293 | 258 | 5.horizontalSpace, |
294 | 259 | GestureDetector( |
295 | 260 | onTap: () { |
... | ... | @@ -301,9 +266,7 @@ class _LoginPageView extends StatelessWidget { |
301 | 266 | alignment: Alignment.centerLeft, |
302 | 267 | child: Text( |
303 | 268 | '忘记密码 ?', |
304 | - style: TextStyle( | |
305 | - fontSize: 12.sp | |
306 | - ), | |
269 | + style: TextStyle(fontSize: 12.sp), | |
307 | 270 | ), |
308 | 271 | ), |
309 | 272 | ) | ... | ... |
lib/utils/loading.dart
1 | 1 | import 'package:flutter_easyloading/flutter_easyloading.dart'; |
2 | 2 | |
3 | -Future loading(Function block, {bool isShowLoading = true}) async { | |
4 | - if (isShowLoading) { | |
5 | - showLoading(); | |
3 | +Future<T?> loading<T>(Function block, {String loadingText = '加载中...'}) async { | |
4 | + if (loadingText.isNotEmpty) { | |
5 | + showLoading(loadingText); | |
6 | 6 | } |
7 | 7 | try { |
8 | - await block(); | |
8 | + return await block(); | |
9 | 9 | } catch (e) { |
10 | 10 | rethrow; |
11 | 11 | } finally { |
12 | 12 | dismissLoading(); |
13 | 13 | } |
14 | - return; | |
15 | 14 | } |
16 | 15 | |
17 | -void showLoading() { | |
18 | - EasyLoading.show(status: "加载中..."); | |
16 | +void showLoading(String text) { | |
17 | + EasyLoading.show(status: text); | |
19 | 18 | } |
20 | 19 | |
21 | 20 | void dismissLoading() { | ... | ... |