Commit 354ac7e64b6a9d4ae13f9e117567712c02229d42
1 parent
a8f96625
feat:隐藏视频跟读入口、底部草坪图片优化;修改密码增加返回图标;语音问答题录音权限未授权导致录音失败
Showing
12 changed files
with
157 additions
and
128 deletions
assets/images/bottom_grass.png
lib/common/dialogs/customer_dialog.dart
1 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
2 | import 'package:flutter_screenutil/flutter_screenutil.dart'; | 2 | import 'package:flutter_screenutil/flutter_screenutil.dart'; |
3 | -import 'package:wow_english/route/route.dart'; | ||
4 | 3 | ||
5 | class CustomerTwoActionDialog extends Dialog { | 4 | class CustomerTwoActionDialog extends Dialog { |
6 | const CustomerTwoActionDialog( | 5 | const CustomerTwoActionDialog( |
lib/pages/home/widgets/home_tab_header_widget.dart
@@ -83,13 +83,13 @@ class HomeTabHeaderWidget extends StatelessWidget { | @@ -83,13 +83,13 @@ class HomeTabHeaderWidget extends StatelessWidget { | ||
83 | textAlign: TextAlign.left, | 83 | textAlign: TextAlign.left, |
84 | style: const TextStyle(color: Colors.white, fontSize: 30.0), | 84 | style: const TextStyle(color: Colors.white, fontSize: 30.0), |
85 | )), | 85 | )), |
86 | - IconButton( | ||
87 | - onPressed: () { | ||
88 | - if (actionTap != null) { | ||
89 | - actionTap!(HeaderActionType.video); | ||
90 | - } | ||
91 | - }, | ||
92 | - icon: Image.asset('video'.assetPng)), | 86 | + // IconButton( |
87 | + // onPressed: () { | ||
88 | + // if (actionTap != null) { | ||
89 | + // actionTap!(HeaderActionType.video); | ||
90 | + // } | ||
91 | + // }, | ||
92 | + // icon: Image.asset('video'.assetPng)), | ||
93 | IconButton( | 93 | IconButton( |
94 | onPressed: () { | 94 | onPressed: () { |
95 | if (actionTap != null) { | 95 | if (actionTap != null) { |
lib/pages/lessons/widgets/lesson_item_widget.dart
@@ -3,7 +3,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; | @@ -3,7 +3,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; | ||
3 | import 'package:wow_english/common/extension/string_extension.dart'; | 3 | import 'package:wow_english/common/extension/string_extension.dart'; |
4 | import 'package:wow_english/common/widgets/ow_image_widget.dart'; | 4 | import 'package:wow_english/common/widgets/ow_image_widget.dart'; |
5 | import 'package:wow_english/models/course_module_entity.dart'; | 5 | import 'package:wow_english/models/course_module_entity.dart'; |
6 | -import 'package:wow_english/utils/color_util.dart'; | ||
7 | 6 | ||
8 | import '../../home/courese_module_model.dart'; | 7 | import '../../home/courese_module_model.dart'; |
9 | 8 |
lib/pages/login/forgetpwd/forget_password_home_page.dart
@@ -53,115 +53,133 @@ class _ForgetPasswordHomePageView extends StatelessWidget { | @@ -53,115 +53,133 @@ class _ForgetPasswordHomePageView extends StatelessWidget { | ||
53 | body: Container( | 53 | body: Container( |
54 | color: Colors.white, | 54 | color: Colors.white, |
55 | child: SafeArea( | 55 | child: SafeArea( |
56 | - child: SingleChildScrollView( | ||
57 | - child: Padding( | ||
58 | - padding: EdgeInsets.only(left: 49.w, right: 10.w), | ||
59 | - child: Column( | ||
60 | - children: [ | ||
61 | - 34.verticalSpace, | ||
62 | - Row( | ||
63 | - children: [ | ||
64 | - Image.asset( | ||
65 | - 'wow_logo'.assetPng, | ||
66 | - height: 49.w, | ||
67 | - width: 83.5.h, | ||
68 | - ), | ||
69 | - 12.5.horizontalSpace, | ||
70 | - Text( | ||
71 | - '修改密码\n请输入您的手机号和验证码吧', | ||
72 | - style: TextStyle(fontSize: 16.sp, color: const Color(0xFF666666)), | ||
73 | - ) | ||
74 | - ], | ||
75 | - ), | ||
76 | - Row( | ||
77 | - crossAxisAlignment: CrossAxisAlignment.start, | ||
78 | - children: [ | ||
79 | - Expanded( | ||
80 | - child: Column( | ||
81 | - children: [ | ||
82 | - 44.5.verticalSpace, | ||
83 | - Row( | ||
84 | - children: [ | ||
85 | - Image.asset( | ||
86 | - 'phone'.assetPng, | ||
87 | - height: 45.h, | ||
88 | - width: 35.w, | ||
89 | - ), | ||
90 | - 15.horizontalSpace, | ||
91 | - Expanded( | ||
92 | - child: TextFieldCustomerWidget( | ||
93 | - height: 50.h, | ||
94 | - hitText: '请输入当前手机号', | ||
95 | - textInputType: TextInputType.phone, | ||
96 | - bgImageName: 'Input_layer_up', | ||
97 | - onChangeValue: (String value) { | ||
98 | - bloc.add(PhoneNumChangeEvent()); | ||
99 | - }, | ||
100 | - controller: bloc.phoneNumController, | ||
101 | - )) | ||
102 | - ], | ||
103 | - ), | ||
104 | - 11.5.verticalSpace, | ||
105 | - Row( | ||
106 | - mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||
107 | - children: [ | ||
108 | - Image.asset( | ||
109 | - 'lock'.assetPng, | ||
110 | - height: 34.h, | ||
111 | - width: 31.w, | ||
112 | - ), | ||
113 | - 18.5.horizontalSpace, | ||
114 | - Expanded( | ||
115 | - child: TextFieldCustomerWidget( | ||
116 | - hitText: '请输入验证码', | ||
117 | - bgImageName: 'Input_layer_down', | ||
118 | - onChangeValue: (String value) { | ||
119 | - bloc.add(CheckCodeChangeEvent()); | ||
120 | - }, | ||
121 | - textInputType: TextInputType.emailAddress, | ||
122 | - controller: bloc.checkNumController, | ||
123 | - )), | ||
124 | - 16.5.horizontalSpace, | ||
125 | - TimerWidget( | ||
126 | - pageType: 1, | ||
127 | - canSendSms: bloc.canSendSms, | ||
128 | - sendSmsEvent: () => bloc.add(SendSmsCodeEvent()), | ||
129 | - ) | ||
130 | - ], | ||
131 | - ) | ||
132 | - ], | ||
133 | - )), | ||
134 | - 2.verticalSpace, | ||
135 | - Image.asset( | ||
136 | - 'steven_bride'.assetPng, | ||
137 | - height: 173.h, | ||
138 | - width: 157.w, | ||
139 | - ) | ||
140 | - ], | 56 | + child: Stack( |
57 | + children: [ | ||
58 | + SingleChildScrollView( | ||
59 | + child: Padding( | ||
60 | + padding: EdgeInsets.only(left: 49.w, right: 10.w), | ||
61 | + child: Column( | ||
62 | + children: [ | ||
63 | + 34.verticalSpace, | ||
64 | + Row( | ||
65 | + children: [ | ||
66 | + Image.asset( | ||
67 | + 'wow_logo'.assetPng, | ||
68 | + height: 49.w, | ||
69 | + width: 83.5.h, | ||
70 | + ), | ||
71 | + 12.5.horizontalSpace, | ||
72 | + Text( | ||
73 | + '修改密码\n请输入您的手机号和验证码吧', | ||
74 | + style: TextStyle(fontSize: 16.sp, color: const Color(0xFF666666)), | ||
75 | + ) | ||
76 | + ], | ||
77 | + ), | ||
78 | + Row( | ||
79 | + crossAxisAlignment: CrossAxisAlignment.start, | ||
80 | + children: [ | ||
81 | + Expanded( | ||
82 | + child: Column( | ||
83 | + children: [ | ||
84 | + 44.5.verticalSpace, | ||
85 | + Row( | ||
86 | + children: [ | ||
87 | + Image.asset( | ||
88 | + 'phone'.assetPng, | ||
89 | + height: 45.h, | ||
90 | + width: 35.w, | ||
91 | + ), | ||
92 | + 15.horizontalSpace, | ||
93 | + Expanded( | ||
94 | + child: TextFieldCustomerWidget( | ||
95 | + height: 50.h, | ||
96 | + hitText: '请输入当前手机号', | ||
97 | + textInputType: TextInputType.phone, | ||
98 | + bgImageName: 'Input_layer_up', | ||
99 | + onChangeValue: (String value) { | ||
100 | + bloc.add(PhoneNumChangeEvent()); | ||
101 | + }, | ||
102 | + controller: bloc.phoneNumController, | ||
103 | + )) | ||
104 | + ], | ||
105 | + ), | ||
106 | + 11.5.verticalSpace, | ||
107 | + Row( | ||
108 | + mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||
109 | + children: [ | ||
110 | + Image.asset( | ||
111 | + 'lock'.assetPng, | ||
112 | + height: 34.h, | ||
113 | + width: 31.w, | ||
114 | + ), | ||
115 | + 18.5.horizontalSpace, | ||
116 | + Expanded( | ||
117 | + child: TextFieldCustomerWidget( | ||
118 | + hitText: '请输入验证码', | ||
119 | + bgImageName: 'Input_layer_down', | ||
120 | + onChangeValue: (String value) { | ||
121 | + bloc.add(CheckCodeChangeEvent()); | ||
122 | + }, | ||
123 | + textInputType: TextInputType.emailAddress, | ||
124 | + controller: bloc.checkNumController, | ||
125 | + )), | ||
126 | + 16.5.horizontalSpace, | ||
127 | + TimerWidget( | ||
128 | + pageType: 1, | ||
129 | + canSendSms: bloc.canSendSms, | ||
130 | + sendSmsEvent: () => bloc.add(SendSmsCodeEvent()), | ||
131 | + ) | ||
132 | + ], | ||
133 | + ) | ||
134 | + ], | ||
135 | + )), | ||
136 | + 2.verticalSpace, | ||
137 | + Image.asset( | ||
138 | + 'steven_bride'.assetPng, | ||
139 | + height: 173.h, | ||
140 | + width: 157.w, | ||
141 | + ) | ||
142 | + ], | ||
143 | + ), | ||
144 | + GestureDetector( | ||
145 | + onTap: () { | ||
146 | + if (bloc.canSetPwd) { | ||
147 | + bloc.add(SetPassWordEvent()); | ||
148 | + } | ||
149 | + }, | ||
150 | + child: Container( | ||
151 | + decoration: BoxDecoration( | ||
152 | + image: DecorationImage( | ||
153 | + image: AssetImage(bloc.canSetPwd ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), | ||
154 | + fit: BoxFit.fill), | ||
155 | + ), | ||
156 | + padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), | ||
157 | + child: Text( | ||
158 | + '确定', | ||
159 | + style: TextStyle(fontSize: 16.sp, color: Colors.white), | ||
160 | + ), | ||
161 | + ), | ||
162 | + ) | ||
163 | + ], | ||
164 | + ), | ||
141 | ), | 165 | ), |
142 | - GestureDetector( | ||
143 | - onTap: () { | ||
144 | - if (bloc.canSetPwd) { | ||
145 | - bloc.add(SetPassWordEvent()); | ||
146 | - } | 166 | + ), |
167 | + Container( | ||
168 | + padding: EdgeInsets.only(top: 16.h), | ||
169 | + alignment: Alignment.topLeft, | ||
170 | + child: IconButton( | ||
171 | + onPressed: () { | ||
172 | + Navigator.pop(context); | ||
147 | }, | 173 | }, |
148 | - child: Container( | ||
149 | - decoration: BoxDecoration( | ||
150 | - image: DecorationImage( | ||
151 | - image: AssetImage(bloc.canSetPwd ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), | ||
152 | - fit: BoxFit.fill), | ||
153 | - ), | ||
154 | - padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), | ||
155 | - child: Text( | ||
156 | - '确定', | ||
157 | - style: TextStyle(fontSize: 16.sp, color: Colors.white), | ||
158 | - ), | ||
159 | - ), | ||
160 | - ) | ||
161 | - ], | ||
162 | - ), | ||
163 | - ), | ||
164 | - ), | 174 | + icon: Image.asset( |
175 | + 'back_around'.assetPng, | ||
176 | + width: 40.w, | ||
177 | + height: 40.h, | ||
178 | + ) | ||
179 | + ), | ||
180 | + ), | ||
181 | + ] | ||
182 | + ) | ||
165 | ), | 183 | ), |
166 | ), | 184 | ), |
167 | ); | 185 | ); |
lib/pages/login/setpwd/bloc/set_pwd_bloc.dart
1 | -import 'package:common_utils/common_utils.dart'; | ||
2 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
3 | import 'package:flutter_bloc/flutter_bloc.dart'; | 2 | import 'package:flutter_bloc/flutter_bloc.dart'; |
4 | import 'package:wow_english/common/request/dao/user_dao.dart'; | 3 | import 'package:wow_english/common/request/dao/user_dao.dart'; |
lib/pages/practice/bloc/topic_picture_bloc.dart
@@ -4,12 +4,15 @@ import 'package:flutter/foundation.dart'; | @@ -4,12 +4,15 @@ import 'package:flutter/foundation.dart'; | ||
4 | import 'package:flutter/services.dart'; | 4 | import 'package:flutter/services.dart'; |
5 | import 'package:flutter_bloc/flutter_bloc.dart'; | 5 | import 'package:flutter_bloc/flutter_bloc.dart'; |
6 | import 'package:flutter_easyloading/flutter_easyloading.dart'; | 6 | import 'package:flutter_easyloading/flutter_easyloading.dart'; |
7 | +import 'package:permission_handler/permission_handler.dart'; | ||
7 | import 'package:wow_english/common/request/dao/listen_dao.dart'; | 8 | import 'package:wow_english/common/request/dao/listen_dao.dart'; |
8 | import 'package:wow_english/common/request/exception.dart'; | 9 | import 'package:wow_english/common/request/exception.dart'; |
9 | import 'package:wow_english/models/course_process_entity.dart'; | 10 | import 'package:wow_english/models/course_process_entity.dart'; |
10 | import 'package:wow_english/utils/loading.dart'; | 11 | import 'package:wow_english/utils/loading.dart'; |
11 | import 'package:wow_english/utils/toast_util.dart'; | 12 | import 'package:wow_english/utils/toast_util.dart'; |
12 | 13 | ||
14 | +import '../../../common/permission/permissionRequestPage.dart'; | ||
15 | + | ||
13 | part 'topic_picture_event.dart'; | 16 | part 'topic_picture_event.dart'; |
14 | part 'topic_picture_state.dart'; | 17 | part 'topic_picture_state.dart'; |
15 | 18 | ||
@@ -56,7 +59,9 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | @@ -56,7 +59,9 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | ||
56 | 59 | ||
57 | late AudioPlayer audioPlayer; | 60 | late AudioPlayer audioPlayer; |
58 | 61 | ||
59 | - TopicPictureBloc(this.pageController, this.courseLessonId) : super(TopicPictureInitial()) { | 62 | + final BuildContext context; |
63 | + | ||
64 | + TopicPictureBloc(this.context, this.pageController, this.courseLessonId) : super(TopicPictureInitial()) { | ||
60 | on<CurrentPageIndexChangeEvent>(_pageControllerChange); | 65 | on<CurrentPageIndexChangeEvent>(_pageControllerChange); |
61 | on<VoicePlayStateChangeEvent>(_voicePlayStateChange); | 66 | on<VoicePlayStateChangeEvent>(_voicePlayStateChange); |
62 | on<XSVoiceResultEvent>(_voiceXsResult); | 67 | on<XSVoiceResultEvent>(_voiceXsResult); |
@@ -183,12 +188,24 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | @@ -183,12 +188,24 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | ||
183 | ///先声测试 | 188 | ///先声测试 |
184 | void _voiceXsTest(XSVoiceTestEvent event,Emitter<TopicPictureState> emitter) async { | 189 | void _voiceXsTest(XSVoiceTestEvent event,Emitter<TopicPictureState> emitter) async { |
185 | await audioPlayer.stop(); | 190 | await audioPlayer.stop(); |
186 | - methodChannel.invokeMethod( | ||
187 | - 'startVoice', | ||
188 | - {'word':event.testWord,'type':event.type,'userId':event.userId.toString()} | 191 | + // 调用封装好的权限检查和请求方法 |
192 | + bool result = await permissionCheckAndRequest( | ||
193 | + context, | ||
194 | + Permission.microphone, | ||
195 | + "录音" | ||
189 | ); | 196 | ); |
190 | - _isVoicing = true; | ||
191 | - emitter(XSVoiceTestState()); | 197 | + if (result) { |
198 | + methodChannel.invokeMethod( | ||
199 | + 'startVoice', | ||
200 | + { | ||
201 | + 'word': event.testWord, | ||
202 | + 'type': event.type, | ||
203 | + 'userId': event.userId.toString() | ||
204 | + } | ||
205 | + ); | ||
206 | + _isVoicing = true; | ||
207 | + emitter(XSVoiceTestState()); | ||
208 | + } | ||
192 | } | 209 | } |
193 | 210 | ||
194 | ///终止评测 | 211 | ///终止评测 |
lib/pages/practice/topic_picture_page.dart
@@ -21,6 +21,7 @@ class TopicPicturePage extends StatelessWidget { | @@ -21,6 +21,7 @@ class TopicPicturePage extends StatelessWidget { | ||
21 | Widget build(BuildContext context) { | 21 | Widget build(BuildContext context) { |
22 | return BlocProvider( | 22 | return BlocProvider( |
23 | create: (context) => TopicPictureBloc( | 23 | create: (context) => TopicPictureBloc( |
24 | + context, | ||
24 | PageController(), | 25 | PageController(), |
25 | courseLessonId??'', | 26 | courseLessonId??'', |
26 | ) | 27 | ) |
lib/pages/reading/bloc/reading_bloc.dart
@@ -338,7 +338,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -338,7 +338,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
338 | nextPage(); | 338 | nextPage(); |
339 | } | 339 | } |
340 | 340 | ||
341 | - Log.d("_onAudioPlayComplete _isOriginAudioPlaying=${_isOriginAudioPlaying} _voicePlayState=$_voicePlayState recordUrl=${currentPageData()?.recordUrl?.isNotEmpty}"); | 341 | + Log.d("_onAudioPlayComplete _isOriginAudioPlaying=$_isOriginAudioPlaying _voicePlayState=$_voicePlayState recordUrl=${currentPageData()?.recordUrl?.isNotEmpty}"); |
342 | if (_isOriginAudioPlaying && _voicePlayState == VoicePlayState.completed && currentPageData()?.recordUrl?.isNotEmpty != true) { | 342 | if (_isOriginAudioPlaying && _voicePlayState == VoicePlayState.completed && currentPageData()?.recordUrl?.isNotEmpty != true) { |
343 | ///如果刚刚完成原音播放&&录音为空,则开始录音 | 343 | ///如果刚刚完成原音播放&&录音为空,则开始录音 |
344 | startRecord(currentPageData()?.word ?? ''); | 344 | startRecord(currentPageData()?.word ?? ''); |
lib/pages/shop/exchane/bloc/exchange_lesson_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:wow_english/common/request/exception.dart'; | ||
4 | import 'package:wow_english/utils/loading.dart'; | 3 | import 'package:wow_english/utils/loading.dart'; |
5 | -import 'package:wow_english/utils/toast_util.dart'; | ||
6 | 4 | ||
7 | import '../../../../common/request/dao/request_dao.dart'; | 5 | import '../../../../common/request/dao/request_dao.dart'; |
8 | 6 |
lib/pages/shop/home/bloc/shop_home_bloc.dart