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
lib/pages/home/widgets/home_tab_header_widget.dart
| ... | ... | @@ -83,13 +83,13 @@ class HomeTabHeaderWidget extends StatelessWidget { |
| 83 | 83 | textAlign: TextAlign.left, |
| 84 | 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 | 93 | IconButton( |
| 94 | 94 | onPressed: () { |
| 95 | 95 | if (actionTap != null) { | ... | ... |
lib/pages/lessons/widgets/lesson_item_widget.dart
| ... | ... | @@ -3,7 +3,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; |
| 3 | 3 | import 'package:wow_english/common/extension/string_extension.dart'; |
| 4 | 4 | import 'package:wow_english/common/widgets/ow_image_widget.dart'; |
| 5 | 5 | import 'package:wow_english/models/course_module_entity.dart'; |
| 6 | -import 'package:wow_english/utils/color_util.dart'; | |
| 7 | 6 | |
| 8 | 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 | 53 | body: Container( |
| 54 | 54 | color: Colors.white, |
| 55 | 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
lib/pages/practice/bloc/topic_picture_bloc.dart
| ... | ... | @@ -4,12 +4,15 @@ import 'package:flutter/foundation.dart'; |
| 4 | 4 | import 'package:flutter/services.dart'; |
| 5 | 5 | import 'package:flutter_bloc/flutter_bloc.dart'; |
| 6 | 6 | import 'package:flutter_easyloading/flutter_easyloading.dart'; |
| 7 | +import 'package:permission_handler/permission_handler.dart'; | |
| 7 | 8 | import 'package:wow_english/common/request/dao/listen_dao.dart'; |
| 8 | 9 | import 'package:wow_english/common/request/exception.dart'; |
| 9 | 10 | import 'package:wow_english/models/course_process_entity.dart'; |
| 10 | 11 | import 'package:wow_english/utils/loading.dart'; |
| 11 | 12 | import 'package:wow_english/utils/toast_util.dart'; |
| 12 | 13 | |
| 14 | +import '../../../common/permission/permissionRequestPage.dart'; | |
| 15 | + | |
| 13 | 16 | part 'topic_picture_event.dart'; |
| 14 | 17 | part 'topic_picture_state.dart'; |
| 15 | 18 | |
| ... | ... | @@ -56,7 +59,9 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { |
| 56 | 59 | |
| 57 | 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 | 65 | on<CurrentPageIndexChangeEvent>(_pageControllerChange); |
| 61 | 66 | on<VoicePlayStateChangeEvent>(_voicePlayStateChange); |
| 62 | 67 | on<XSVoiceResultEvent>(_voiceXsResult); |
| ... | ... | @@ -183,12 +188,24 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { |
| 183 | 188 | ///先声测试 |
| 184 | 189 | void _voiceXsTest(XSVoiceTestEvent event,Emitter<TopicPictureState> emitter) async { |
| 185 | 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
lib/pages/reading/bloc/reading_bloc.dart
| ... | ... | @@ -338,7 +338,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { |
| 338 | 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 | 342 | if (_isOriginAudioPlaying && _voicePlayState == VoicePlayState.completed && currentPageData()?.recordUrl?.isNotEmpty != true) { |
| 343 | 343 | ///如果刚刚完成原音播放&&录音为空,则开始录音 |
| 344 | 344 | startRecord(currentPageData()?.word ?? ''); | ... | ... |
lib/pages/shop/exchane/bloc/exchange_lesson_bloc.dart
| 1 | 1 | import 'package:flutter/cupertino.dart'; |
| 2 | 2 | import 'package:flutter_bloc/flutter_bloc.dart'; |
| 3 | -import 'package:wow_english/common/request/exception.dart'; | |
| 4 | 3 | import 'package:wow_english/utils/loading.dart'; |
| 5 | -import 'package:wow_english/utils/toast_util.dart'; | |
| 6 | 4 | |
| 7 | 5 | import '../../../../common/request/dao/request_dao.dart'; |
| 8 | 6 | ... | ... |
lib/pages/shop/home/bloc/shop_home_bloc.dart