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