diff --git a/assets/images/check_lesson_back.png b/assets/images/check_lesson_back.png new file mode 100644 index 0000000..22b4122 --- /dev/null +++ b/assets/images/check_lesson_back.png diff --git a/assets/images/check_steve.png b/assets/images/check_steve.png new file mode 100644 index 0000000..9317a60 --- /dev/null +++ b/assets/images/check_steve.png diff --git a/assets/images/check_yellow.png b/assets/images/check_yellow.png new file mode 100644 index 0000000..81c892a --- /dev/null +++ b/assets/images/check_yellow.png diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index fc058f2..98251e5 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -38,9 +38,8 @@ class _HomePageView extends StatelessWidget { Navigator.of(AppRouter.context).pushNamed(AppRouteName.shop); } else if (type == HeaderActionType.user) { Navigator.of(AppRouter.context).pushNamed(AppRouteName.user); - // Navigator.of(AppRouter.context).pushNamed(AppRouteName.topicPic); } else { - // Navigator.of(AppRouter.context).pushNamed(AppRouteName.topicPic); + } } @@ -91,7 +90,14 @@ class _HomePageView extends StatelessWidget { if (data!.lock!) { return; } - showToast('点击事件'); + if (data!.courseType == 4) {//绘本 + return; + } + + if (data.courseType == 3) {//练习 + Navigator.of(context).pushNamed(AppRouteName.topicPic,arguments: {'courseLessonId':data!.id}); + return; + } }, child: HomeVideoItem( lessons: data, diff --git a/lib/pages/practice/bloc/topic_picture_bloc.dart b/lib/pages/practice/bloc/topic_picture_bloc.dart index af3c597..0bc9ade 100644 --- a/lib/pages/practice/bloc/topic_picture_bloc.dart +++ b/lib/pages/practice/bloc/topic_picture_bloc.dart @@ -16,7 +16,7 @@ class TopicPictureBloc extends Bloc { final PageController pageController; - final int modelCount; + final String courseLessonId; int _currentPage = 0; @@ -39,7 +39,7 @@ class TopicPictureBloc extends Bloc { late AudioPlayer audioPlayer; - TopicPictureBloc(this.pageController, this.modelCount) : super(TopicPictureInitial()) { + TopicPictureBloc(this.pageController, this.courseLessonId) : super(TopicPictureInitial()) { on(_pageControllerChange); on(_selectItemLoad); on(_requestData); @@ -98,7 +98,7 @@ class TopicPictureBloc extends Bloc { void _requestData(RequestDataEvent event,Emitter emitter) async { try { await loading(() async { - _entity = await ListenDao.process('8'); + _entity = await ListenDao.process(courseLessonId); emitter(RequestDataState()); }); } catch (e) { diff --git a/lib/pages/practice/topic_picture_page.dart b/lib/pages/practice/topic_picture_page.dart index 415767d..f79ce4d 100644 --- a/lib/pages/practice/topic_picture_page.dart +++ b/lib/pages/practice/topic_picture_page.dart @@ -10,14 +10,16 @@ import 'bloc/topic_picture_bloc.dart'; import 'widgets/practice_header_widget.dart'; class TopicPicturePage extends StatelessWidget { - const TopicPicturePage({super.key}); + const TopicPicturePage({super.key, this.courseLessonId}); + + final String? courseLessonId; @override Widget build(BuildContext context) { return BlocProvider( create: (context) => TopicPictureBloc( - PageController(), - 3 + PageController(), + courseLessonId??'', ) ..add(RequestDataEvent()) ..add(XSVoiceInitEvent( @@ -38,7 +40,7 @@ class _TopicPicturePage extends StatelessWidget { return BlocListener( listener: (context, state){ if (state is RequestDataState) { - // context.read().add(CurrentPageIndexChangeEvent(0)); + context.read().add(CurrentPageIndexChangeEvent(0)); } if (state is XSVoiceTestState) { diff --git a/lib/pages/shop/exchane/exchange_lesson_page.dart b/lib/pages/shop/exchane/exchange_lesson_page.dart index 3b90cbf..f7ab1b0 100644 --- a/lib/pages/shop/exchane/exchange_lesson_page.dart +++ b/lib/pages/shop/exchane/exchange_lesson_page.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; +import 'package:wow_english/pages/shop/exchane/widegts/exchange_result_dialog.dart'; import 'package:wow_english/route/route.dart'; import 'package:wow_english/utils/toast_util.dart'; @@ -26,9 +27,17 @@ class _ExchangeLessonPage extends StatelessWidget { return BlocListener( listener: (context, state) { if (state is CheckCodeResultState) { - String title = state.result ? '兑换成功' : '兑换失败'; - showToast(title); - Navigator.of(context).pushNamed(AppRouteName.exList); + showDialog( + context: context, + barrierDismissible: !state.result, + builder: (context){ + return ExChangeResultDialog( + resultType:state.result, + onTap:(){ + + } + ); + }); } }, child: _exchangeLessonPageView(), diff --git a/lib/pages/shop/exchane/widegts/exchange_result_dialog.dart b/lib/pages/shop/exchane/widegts/exchange_result_dialog.dart new file mode 100644 index 0000000..9e27ccb --- /dev/null +++ b/lib/pages/shop/exchane/widegts/exchange_result_dialog.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:wow_english/common/extension/string_extension.dart'; + +class ExChangeResultDialog extends Dialog { + const ExChangeResultDialog({super.key,required this.resultType,required this.onTap}); + final bool resultType; + final Function() onTap; + @override + Widget build(BuildContext context) { + super.build(context); + return Container( + alignment: Alignment.center, + child: Container( + height: 173.h, + width: 252.w, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('check_lesson_back'.assetPng), + fit: BoxFit.fill + ), + ), + child: resultType?_successWidget(context):_failWidget() + ), + ); + } + + Widget _successWidget(BuildContext context) { + return Column( + children: [ + 14.verticalSpace, + Image.asset( + 'check_steve'.assetPng, + width: 69.w, + height: 88.h, + ), + Text( + '兑换成功', + style: TextStyle( + fontSize: 14.sp, + color: const Color(0xFF333333) + ),), + 10.verticalSpace, + GestureDetector( + onTap: () { + Navigator.pop(context); + onTap(); + }, + child: Container( + height: 25.h, + width: 100.w, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('check_yellow'.assetPng), + fit: BoxFit.fill + ) + ), + alignment: Alignment.center, + child: Text( + '前往学习', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.sp, + color: Colors.white + ),), + ), + ) + ], + ); + } + + Widget _failWidget() { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Image.asset( + 'steven_bride'.assetPng, + height: 82.h, + width: 75.w, + ), + Text( + '兑换失败,请查看兑换码是否正确或兑换码是否在有效期内', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xFF333333), + fontSize: 14.sp + ), + ) + ], + ); + } + +} \ No newline at end of file diff --git a/lib/pages/user/user_page.dart b/lib/pages/user/user_page.dart index 3a87e97..839de8d 100644 --- a/lib/pages/user/user_page.dart +++ b/lib/pages/user/user_page.dart @@ -74,7 +74,7 @@ class _UserView extends StatelessWidget { children: [ CircleAvatar( radius: 40.r, - backgroundColor: Color(0xFF140C10), + backgroundColor: const Color(0xFF140C10), child: CircleAvatar( radius: 38.5.r, backgroundImage: ImageUtil.getImageProviderOnDefault(user.avatarUrl), @@ -151,7 +151,7 @@ class _UserView extends StatelessWidget { ), 12.verticalSpace, OutlinedButton( - onPressed: () => {}, + onPressed: () => Navigator.of(context).pushNamed(AppRouteName.exLesson), style: normalButtonStyle, child: Text( "兑换课程", diff --git a/lib/route/route.dart b/lib/route/route.dart index db7bfa7..3b0aba6 100644 --- a/lib/route/route.dart +++ b/lib/route/route.dart @@ -36,12 +36,6 @@ class AppRouteName { static const String exList = 'exList'; static const String reAfter = 'reAfter'; static const String topicPic = 'topicPic'; - static const String topicWord = 'topicWord'; - static const String voicePic = 'voicePic'; - static const String voiceWord = 'voiceWord'; - static const String voiceAnswer = 'voiceAnswer'; - - /// 用户个人主页 static const String user = 'user'; /// 用户详细信息页 @@ -97,7 +91,11 @@ class AppRouter { case AppRouteName.userInformation: return CupertinoPageRoute(builder: (_) => const UserInformationPage()); case AppRouteName.topicPic: - return CupertinoPageRoute(builder: (_) => const TopicPicturePage()); + var courseLessonId = ''; + if (settings.arguments != null) { + courseLessonId = (settings.arguments as Map)['courseLessonId'] as String??''; + } + return CupertinoPageRoute(builder: (_) => TopicPicturePage(courseLessonId: courseLessonId)); case AppRouteName.lookVideo: final videoUrl = (settings.arguments as Map)['videoUrl'] as String; final title = (settings.arguments as Map)['title'] as String?;