From 842b7132f392105f396d8d52fba4d9bb321abe8f Mon Sep 17 00:00:00 2001 From: lcy <2503978335@qq.com> Date: Tue, 27 Jun 2023 19:12:14 +0800 Subject: [PATCH] feat:磨耳朵/练习页面调整 --- lib/pages/home/bloc/home_bloc.dart | 15 +-------------- lib/pages/home/home_page.dart | 6 ++++-- lib/pages/lessons/bloc/lesson_bloc.dart | 19 +++++++++++-------- lib/pages/lessons/bloc/lesson_event.dart | 2 ++ lib/pages/lessons/lesson_page.dart | 3 +-- lib/pages/listen/bloc/listen_bloc.dart | 13 ++++++------- lib/pages/listen/bloc/listen_event.dart | 2 ++ lib/pages/listen/listen_page.dart | 9 +++++---- lib/pages/listen/widgets/listen_item_widget.dart | 1 - lib/pages/practice/bloc/topic_picture_bloc.dart | 41 +++++++++++++++++++++++++++++++++++++++++ lib/pages/practice/bloc/topic_picture_event.dart | 14 ++++++++++++++ lib/pages/practice/bloc/topic_picture_state.dart | 10 ++++++++++ lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_bloc.dart | 41 ----------------------------------------- lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_event.dart | 14 -------------- lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_state.dart | 10 ---------- lib/pages/practice/chosetopic/topicpicture/topic_picture_page.dart | 141 --------------------------------------------------------------------------------------------------------------------------------------------- lib/pages/practice/chosetopic/topicword/bloc/topic_word_bloc.dart | 41 ----------------------------------------- lib/pages/practice/chosetopic/topicword/bloc/topic_word_event.dart | 14 -------------- lib/pages/practice/chosetopic/topicword/bloc/topic_word_state.dart | 10 ---------- lib/pages/practice/chosetopic/topicword/topic_word_page.dart | 163 ------------------------------------------------------------------------------------------------------------------------------------------------------------------- lib/pages/practice/topic_picture_page.dart | 448 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_bloc.dart | 39 --------------------------------------- lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_event.dart | 14 -------------- lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_state.dart | 10 ---------- lib/pages/practice/voicetopic/voicepicture/voice_pic_page.dart | 151 ------------------------------------------------------------------------------------------------------------------------------------------------------- lib/pages/practice/voicetopic/voiceword/bloc/voice_word_bloc.dart | 41 ----------------------------------------- lib/pages/practice/voicetopic/voiceword/bloc/voice_word_event.dart | 14 -------------- lib/pages/practice/voicetopic/voiceword/bloc/voice_word_state.dart | 10 ---------- lib/pages/practice/voicetopic/voiceword/voice_word_page.dart | 160 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- lib/pages/repeatafter/bloc/repeat_after_bloc.dart | 8 +++----- lib/pages/repeatafter/bloc/repeat_after_event.dart | 2 ++ lib/pages/repeatafter/repeat_after_page.dart | 2 +- lib/pages/video/lookvideo/look_video_page.dart | 24 +++--------------------- lib/pages/video/lookvideo/widgets/video_opera_widget.dart | 56 +++++++++++++++++++++++++++++--------------------------- lib/pages/video/lookvideo/widgets/video_widget.dart | 11 +++++------ lib/pages/voiceanswer/bloc/voice_answer_bloc.dart | 13 ------------- lib/pages/voiceanswer/bloc/voice_answer_event.dart | 4 ---- lib/pages/voiceanswer/bloc/voice_answer_state.dart | 6 ------ lib/pages/voiceanswer/voice_answer_page.dart | 95 ----------------------------------------------------------------------------------------------- lib/route/route.dart | 17 +++-------------- 40 files changed, 591 insertions(+), 1103 deletions(-) create mode 100644 lib/pages/practice/bloc/topic_picture_bloc.dart create mode 100644 lib/pages/practice/bloc/topic_picture_event.dart create mode 100644 lib/pages/practice/bloc/topic_picture_state.dart delete mode 100644 lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_bloc.dart delete mode 100644 lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_event.dart delete mode 100644 lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_state.dart delete mode 100644 lib/pages/practice/chosetopic/topicpicture/topic_picture_page.dart delete mode 100644 lib/pages/practice/chosetopic/topicword/bloc/topic_word_bloc.dart delete mode 100644 lib/pages/practice/chosetopic/topicword/bloc/topic_word_event.dart delete mode 100644 lib/pages/practice/chosetopic/topicword/bloc/topic_word_state.dart delete mode 100644 lib/pages/practice/chosetopic/topicword/topic_word_page.dart create mode 100644 lib/pages/practice/topic_picture_page.dart delete mode 100644 lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_bloc.dart delete mode 100644 lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_event.dart delete mode 100644 lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_state.dart delete mode 100644 lib/pages/practice/voicetopic/voicepicture/voice_pic_page.dart delete mode 100644 lib/pages/practice/voicetopic/voiceword/bloc/voice_word_bloc.dart delete mode 100644 lib/pages/practice/voicetopic/voiceword/bloc/voice_word_event.dart delete mode 100644 lib/pages/practice/voicetopic/voiceword/bloc/voice_word_state.dart delete mode 100644 lib/pages/practice/voicetopic/voiceword/voice_word_page.dart delete mode 100644 lib/pages/voiceanswer/bloc/voice_answer_bloc.dart delete mode 100644 lib/pages/voiceanswer/bloc/voice_answer_event.dart delete mode 100644 lib/pages/voiceanswer/bloc/voice_answer_state.dart delete mode 100644 lib/pages/voiceanswer/voice_answer_page.dart diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index 6252675..8cd3a80 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -21,23 +21,10 @@ class HomeBloc extends Bloc { on(_requestData); } - Future requestData() async { - try { - await loading(() async { - _modelData = await HomeDao.courseLesson(moduleId: moduleId??''); - emit(HomeDataLoadState()); - }); - } catch (e) { - if (e is ApiException) { - EasyLoading.showToast(e.message.toString()); - } - } - } - void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { - HomeDao.courseLesson(); + _modelData = await HomeDao.courseLesson(moduleId: moduleId??''); emitter(HomeDataLoadState()); }); } catch (e) { diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 05fe0d3..d8ee0f7 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -20,7 +20,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => HomeBloc(moduleId)..requestData(), + create: (context) => HomeBloc(moduleId)..add(RequestDataEvent()), child: _HomePageView(), ); } @@ -37,7 +37,8 @@ class _HomePageView extends StatelessWidget { } else if (type == HeaderActionType.shop) { 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); + // Navigator.of(AppRouter.context).pushNamed(AppRouteName.user); } else { // Navigator.of(AppRouter.context).pushNamed(AppRouteName.topicPic); // Navigator.of(AppRouter.context).pushNamed(AppRouteName.topicWord); @@ -132,6 +133,7 @@ class _HomePageView extends StatelessWidget { 'blue-positive'.assetPng, height: 47.h, width: 80.w, + // color: Colors.red, ), ], ), diff --git a/lib/pages/lessons/bloc/lesson_bloc.dart b/lib/pages/lessons/bloc/lesson_bloc.dart index ac59ef4..02838d3 100644 --- a/lib/pages/lessons/bloc/lesson_bloc.dart +++ b/lib/pages/lessons/bloc/lesson_bloc.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:wow_english/common/request/dao/home_dao.dart'; import 'package:wow_english/common/request/exception.dart'; import 'package:wow_english/models/course_module_entity.dart'; @@ -25,26 +26,28 @@ class LessonBloc extends Bloc { LessonBloc(this.pageIndex,this.pageController) : super(LessonInitial()) { _currentPageIndex = pageIndex; on(_pageIndexChange); + on(_requestData); } - Future requestData() async { + + void _pageIndexChange(PageViewChangeIndexEvent event,Emitter emitter) async { + _currentPageIndex = event.index; + emitter(PageIndexChangeState()); + } + + void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { _listData = await HomeDao.courseModule()??[]; - emit(LessonDataLoadState()); + emitter(LessonDataLoadState()); }); } catch (e) { if (e is ApiException) { - + EasyLoading.showToast(e.message??'请求失败,请检查网络连接'); } } } - void _pageIndexChange(PageViewChangeIndexEvent event,Emitter emitter) async { - _currentPageIndex = event.index; - emitter(PageIndexChangeState()); - } - @override Future close() { pageController.dispose(); diff --git a/lib/pages/lessons/bloc/lesson_event.dart b/lib/pages/lessons/bloc/lesson_event.dart index 13338d6..7dd5fda 100644 --- a/lib/pages/lessons/bloc/lesson_event.dart +++ b/lib/pages/lessons/bloc/lesson_event.dart @@ -7,3 +7,5 @@ class PageViewChangeIndexEvent extends LessonEvent { final int index; PageViewChangeIndexEvent(this.index); } + +class RequestDataEvent extends LessonEvent {} diff --git a/lib/pages/lessons/lesson_page.dart b/lib/pages/lessons/lesson_page.dart index 861f1f4..c7dc3a7 100644 --- a/lib/pages/lessons/lesson_page.dart +++ b/lib/pages/lessons/lesson_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/we_app_bar.dart'; @@ -24,7 +23,7 @@ class LessonPage extends StatelessWidget { initialPage: starPageIndex??0, viewportFraction: 0.3 ), - )..requestData(), + )..add(RequestDataEvent()), child: _LessonPageView(), ); } diff --git a/lib/pages/listen/bloc/listen_bloc.dart b/lib/pages/listen/bloc/listen_bloc.dart index 035f753..57a651d 100644 --- a/lib/pages/listen/bloc/listen_bloc.dart +++ b/lib/pages/listen/bloc/listen_bloc.dart @@ -13,20 +13,19 @@ part 'listen_state.dart'; class ListenBloc extends Bloc { - List? _listData; - List? get listData => _listData; + List _listData = []; + List get listData => _listData; ListenBloc() : super(ListenInitial()) { - on((event, emit) { - // TODO: implement event handler - }); + on(_requestData); } - Future requestData() async { + + void _requestData(RequestDataEvent event,Emitter emitter) async { try { await loading(() async { _listData = await ListenDao.listen()??[]; - emit(RequestListenDataState()); + emitter(RequestListenDataState()); }); } catch (e) { if (e is ApiException) { diff --git a/lib/pages/listen/bloc/listen_event.dart b/lib/pages/listen/bloc/listen_event.dart index 84f8d1c..e483c50 100644 --- a/lib/pages/listen/bloc/listen_event.dart +++ b/lib/pages/listen/bloc/listen_event.dart @@ -2,3 +2,5 @@ part of 'listen_bloc.dart'; @immutable abstract class ListenEvent {} + +class RequestDataEvent extends ListenEvent {} diff --git a/lib/pages/listen/listen_page.dart b/lib/pages/listen/listen_page.dart index 73c1306..0b56e50 100644 --- a/lib/pages/listen/listen_page.dart +++ b/lib/pages/listen/listen_page.dart @@ -13,7 +13,7 @@ class ListenPage extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => ListenBloc()..requestData(), + create: (context) => ListenBloc()..add(RequestDataEvent()), child: _ListenPageView(), ); } @@ -40,14 +40,15 @@ class _ListenPageView extends StatelessWidget { builder: (context, state) { final bloc = BlocProvider.of(context); return ListView.builder( - itemCount: bloc.listData?.length, + itemCount: bloc.listData.length, scrollDirection: Axis.horizontal, padding: EdgeInsets.symmetric(horizontal: 30.w,vertical: 36.h), itemBuilder: (BuildContext context,int index){ + final entity = bloc.listData[index]; return ListenItemWidget( - entity: bloc.listData?[index], + entity: entity, clickEvent: (){ - Navigator.of(context).pushNamed(AppRouteName.lookVideo,arguments: {'videoUrl':'https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/7194236f31b2e1e3da0fe06cfed4ba2b.mp4'}); + Navigator.of(context).pushNamed(AppRouteName.lookVideo,arguments: {'videoUrl':entity?.videoUrl,'title':'listen'}); }); }); }); diff --git a/lib/pages/listen/widgets/listen_item_widget.dart b/lib/pages/listen/widgets/listen_item_widget.dart index 4bc4261..e3a6cc2 100644 --- a/lib/pages/listen/widgets/listen_item_widget.dart +++ b/lib/pages/listen/widgets/listen_item_widget.dart @@ -1,4 +1,3 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/extension/string_extension.dart'; diff --git a/lib/pages/practice/bloc/topic_picture_bloc.dart b/lib/pages/practice/bloc/topic_picture_bloc.dart new file mode 100644 index 0000000..1248801 --- /dev/null +++ b/lib/pages/practice/bloc/topic_picture_bloc.dart @@ -0,0 +1,41 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +part 'topic_picture_event.dart'; +part 'topic_picture_state.dart'; + +class TopicPictureBloc extends Bloc { + + final PageController pageController; + + final int modelCount; + + int _currentPage = 0; + + int _selectItem = 0; + + int get currentPage => _currentPage + 1; + + int get selectItem => _selectItem; + + TopicPictureBloc(this.pageController, this.modelCount) : super(TopicPictureInitial()) { + on(_pageControllerChange); + on(_selectItemLoad); + } + + @override + Future close() { + pageController.dispose(); + return super.close(); + } + + void _pageControllerChange(CurrentPageIndexChangeEvent event,Emitter emitter) async { + _currentPage = event.pageIndex; + emitter(CurrentPageIndexState()); + } + + void _selectItemLoad(SelectItemEvent event,Emitter emitter) async { + _selectItem = event.selectIndex; + emitter(SelectItemChangeState()); + } +} diff --git a/lib/pages/practice/bloc/topic_picture_event.dart b/lib/pages/practice/bloc/topic_picture_event.dart new file mode 100644 index 0000000..781f545 --- /dev/null +++ b/lib/pages/practice/bloc/topic_picture_event.dart @@ -0,0 +1,14 @@ +part of 'topic_picture_bloc.dart'; + +@immutable +abstract class TopicPictureEvent {} + +class CurrentPageIndexChangeEvent extends TopicPictureEvent { + final int pageIndex; + CurrentPageIndexChangeEvent(this.pageIndex); +} + +class SelectItemEvent extends TopicPictureEvent { + final int selectIndex; + SelectItemEvent(this.selectIndex); +} \ No newline at end of file diff --git a/lib/pages/practice/bloc/topic_picture_state.dart b/lib/pages/practice/bloc/topic_picture_state.dart new file mode 100644 index 0000000..af0e103 --- /dev/null +++ b/lib/pages/practice/bloc/topic_picture_state.dart @@ -0,0 +1,10 @@ +part of 'topic_picture_bloc.dart'; + +@immutable +abstract class TopicPictureState {} + +class TopicPictureInitial extends TopicPictureState {} + +class CurrentPageIndexState extends TopicPictureState {} + +class SelectItemChangeState extends TopicPictureState {} diff --git a/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_bloc.dart b/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_bloc.dart deleted file mode 100644 index 1248801..0000000 --- a/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_bloc.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -part 'topic_picture_event.dart'; -part 'topic_picture_state.dart'; - -class TopicPictureBloc extends Bloc { - - final PageController pageController; - - final int modelCount; - - int _currentPage = 0; - - int _selectItem = 0; - - int get currentPage => _currentPage + 1; - - int get selectItem => _selectItem; - - TopicPictureBloc(this.pageController, this.modelCount) : super(TopicPictureInitial()) { - on(_pageControllerChange); - on(_selectItemLoad); - } - - @override - Future close() { - pageController.dispose(); - return super.close(); - } - - void _pageControllerChange(CurrentPageIndexChangeEvent event,Emitter emitter) async { - _currentPage = event.pageIndex; - emitter(CurrentPageIndexState()); - } - - void _selectItemLoad(SelectItemEvent event,Emitter emitter) async { - _selectItem = event.selectIndex; - emitter(SelectItemChangeState()); - } -} diff --git a/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_event.dart b/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_event.dart deleted file mode 100644 index 781f545..0000000 --- a/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_event.dart +++ /dev/null @@ -1,14 +0,0 @@ -part of 'topic_picture_bloc.dart'; - -@immutable -abstract class TopicPictureEvent {} - -class CurrentPageIndexChangeEvent extends TopicPictureEvent { - final int pageIndex; - CurrentPageIndexChangeEvent(this.pageIndex); -} - -class SelectItemEvent extends TopicPictureEvent { - final int selectIndex; - SelectItemEvent(this.selectIndex); -} \ No newline at end of file diff --git a/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_state.dart b/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_state.dart deleted file mode 100644 index af0e103..0000000 --- a/lib/pages/practice/chosetopic/topicpicture/bloc/topic_picture_state.dart +++ /dev/null @@ -1,10 +0,0 @@ -part of 'topic_picture_bloc.dart'; - -@immutable -abstract class TopicPictureState {} - -class TopicPictureInitial extends TopicPictureState {} - -class CurrentPageIndexState extends TopicPictureState {} - -class SelectItemChangeState extends TopicPictureState {} diff --git a/lib/pages/practice/chosetopic/topicpicture/topic_picture_page.dart b/lib/pages/practice/chosetopic/topicpicture/topic_picture_page.dart deleted file mode 100644 index 995a5e8..0000000 --- a/lib/pages/practice/chosetopic/topicpicture/topic_picture_page.dart +++ /dev/null @@ -1,141 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:wow_english/common/extension/string_extension.dart'; - -import '../../widgets/practice_header_widget.dart'; -import 'bloc/topic_picture_bloc.dart'; - -class TopicPicturePage extends StatelessWidget { - const TopicPicturePage({super.key}); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => TopicPictureBloc(PageController(),3), - child: _TopicPicturePage(), - ); - } -} - -class _TopicPicturePage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state){}, - child: _topicPictureView(), - ); - } - - Widget _topicPictureView() => BlocBuilder( - buildWhen: (_,s) => s is CurrentPageIndexState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return Container( - color: Colors.white, - child: Stack( - children: [ - Column( - children: [ - PracticeHeaderWidget( - title: '${bloc.currentPage}/8', - onTap: (){Navigator.pop(context);}, - ), - Expanded( - child: PageView.builder( - itemCount: 8, - scrollDirection: Axis.horizontal, - controller: bloc.pageController, - onPageChanged: (int index) { - bloc.add(CurrentPageIndexChangeEvent(index)); - }, - itemBuilder: (BuildContext context,int index){ - return _pageViewItemWidget(); - }), - ) - ], - ), - Positioned( - left: 0, - right: 0, - bottom: 0, - child: Image.asset('bottom_grass'.assetPng) - ) - ], - ), - ); - }); - - Widget _pageViewItemWidget() => BlocBuilder( - builder: (context, state){ - final bloc = BlocProvider.of(context); - return SafeArea( - child: Column( - children: [ - Text( - 'What to do when the sentence question is very long and needs a line break', - softWrap: true, - style: TextStyle( - fontSize: 21.sp, - color: const Color(0xFF333333) - ) - ), - 26.verticalSpace, - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Offstage( - offstage: (bloc.modelCount < 1), - child: _decodeImageWidget(1), - ), - Offstage( - offstage: (bloc.modelCount < 2), - child: _decodeImageWidget(2), - ), - Offstage( - offstage: (bloc.modelCount < 3), - child: _decodeImageWidget(3), - ), - Offstage( - offstage: (bloc.modelCount < 4), - child: _decodeImageWidget(4), - ) - ], - ) - ], - ), - ); - }); - - Widget _decodeImageWidget(int index) => BlocBuilder( - buildWhen: (_, s) => s is SelectItemChangeState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return GestureDetector( - onTap: () => bloc.add(SelectItemEvent(index)), - child: Container( - padding: const EdgeInsets.all(4.5), - decoration: BoxDecoration( - color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, - borderRadius: BorderRadius.circular(15), - ), - height: 143.h, - width: 143.w, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), - border: Border.all( - width: 1.0, - color: const Color(0xFF140C10) - ), - image: const DecorationImage( - fit: BoxFit.fitWidth, - image: NetworkImage('https://img1.baidu.com/it/u=3392591833,1640391553&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=714') - ) - ), - ), - ), - ); - }); -} \ No newline at end of file diff --git a/lib/pages/practice/chosetopic/topicword/bloc/topic_word_bloc.dart b/lib/pages/practice/chosetopic/topicword/bloc/topic_word_bloc.dart deleted file mode 100644 index 3197025..0000000 --- a/lib/pages/practice/chosetopic/topicword/bloc/topic_word_bloc.dart +++ /dev/null @@ -1,41 +0,0 @@ - -import 'package:flutter/cupertino.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -part 'topic_word_event.dart'; -part 'topic_word_state.dart'; - -class TopicWordBloc extends Bloc { - final PageController pageController; - - final int modelCount; - - int _currentPage = 0; - - int _selectItem = 0; - - int get currentPage => _currentPage + 1; - - int get selectItem => _selectItem; - - TopicWordBloc(this.pageController, this.modelCount) : super(TopicWordInitial()) { - on(_pageControllerChange); - on(_selectItemLoad); - } - - @override - Future close() { - pageController.dispose(); - return super.close(); - } - - void _pageControllerChange(CurrentPageIndexChangeEvent event,Emitter emitter) async { - _currentPage = event.pageIndex; - emitter(CurrentPageIndexState()); - } - - void _selectItemLoad(SelectItemEvent event,Emitter emitter) async { - _selectItem = event.selectIndex; - emitter(SelectItemChangeState()); - } -} diff --git a/lib/pages/practice/chosetopic/topicword/bloc/topic_word_event.dart b/lib/pages/practice/chosetopic/topicword/bloc/topic_word_event.dart deleted file mode 100644 index 3decdf5..0000000 --- a/lib/pages/practice/chosetopic/topicword/bloc/topic_word_event.dart +++ /dev/null @@ -1,14 +0,0 @@ -part of 'topic_word_bloc.dart'; - -@immutable -abstract class TopicWordEvent {} - -class CurrentPageIndexChangeEvent extends TopicWordEvent { - final int pageIndex; - CurrentPageIndexChangeEvent(this.pageIndex); -} - -class SelectItemEvent extends TopicWordEvent { - final int selectIndex; - SelectItemEvent(this.selectIndex); -} \ No newline at end of file diff --git a/lib/pages/practice/chosetopic/topicword/bloc/topic_word_state.dart b/lib/pages/practice/chosetopic/topicword/bloc/topic_word_state.dart deleted file mode 100644 index a27770f..0000000 --- a/lib/pages/practice/chosetopic/topicword/bloc/topic_word_state.dart +++ /dev/null @@ -1,10 +0,0 @@ -part of 'topic_word_bloc.dart'; - -@immutable -abstract class TopicWordState {} - -class TopicWordInitial extends TopicWordState {} - -class CurrentPageIndexState extends TopicWordState {} - -class SelectItemChangeState extends TopicWordState {} \ No newline at end of file diff --git a/lib/pages/practice/chosetopic/topicword/topic_word_page.dart b/lib/pages/practice/chosetopic/topicword/topic_word_page.dart deleted file mode 100644 index d18dbc4..0000000 --- a/lib/pages/practice/chosetopic/topicword/topic_word_page.dart +++ /dev/null @@ -1,163 +0,0 @@ -import 'package:flutter/material.dart'; -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/pages/practice/widgets/practice_header_widget.dart'; - -import 'bloc/topic_word_bloc.dart'; - -class TopicWordPage extends StatelessWidget { - const TopicWordPage({super.key}); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => TopicWordBloc(PageController(), 4), - child: _TopicWordPage(), - ); - } -} - -class _TopicWordPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state) { - - }, - child: _topicWordView(), - ); - } - - Widget _topicWordView() => BlocBuilder( - builder: (context,state){ - final bloc = BlocProvider.of(context); - return Container( - color: Colors.white, - child: Stack( - children: [ - Positioned( - left: 0, - right: 0, - bottom: 0, - child: Image.asset('background_grass'.assetPng,fit: BoxFit.fitWidth,) - ), - Column( - children: [ - PracticeHeaderWidget( - title: '${bloc.currentPage}/8', - onTap: (){Navigator.pop(context);}, - ), - Expanded( - child: PageView.builder( - itemCount: 8, - scrollDirection: Axis.horizontal, - controller: bloc.pageController, - onPageChanged: (int index) { - bloc.add(CurrentPageIndexChangeEvent(index)); - }, - itemBuilder: (BuildContext context,int index){ - return _pageViewItemWidget(); - }), - ) - ], - ), - ], - ), - ); - }); - - Widget _pageViewItemWidget() => BlocBuilder( - builder: (context, state){ - final bloc = BlocProvider.of(context); - return SafeArea( - child: Column( - children: [ - Text( - 'What to do when the sentence question is very long and needs a line break', - softWrap: true, - style: TextStyle( - fontSize: 21.sp, - color: const Color(0xFF333333) - ) - ), - 26.verticalSpace, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Offstage( - offstage: (bloc.modelCount < 1), - child: _decodeImageWidget(1), - ), - Offstage( - offstage: (bloc.modelCount < 2), - child: _decodeImageWidget(2), - ), - Offstage( - offstage: (bloc.modelCount < 3), - child: _decodeImageWidget(3), - ), - Offstage( - offstage: (bloc.modelCount < 4), - child: _decodeImageWidget(4), - ) - ], - ) - ], - ), - ); - }); - - Widget _decodeImageWidget(int index) => BlocBuilder( - buildWhen: (_, s) => s is SelectItemChangeState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return GestureDetector( - onTap: () => bloc.add(SelectItemEvent(index)), - child: Container( - width: 143.w, - height: 143.h, - padding: EdgeInsets.only(left: 13.w,right: 13.w,top: 13.h,bottom: 13.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), - border: Border.all( - width: 1.0, - color: const Color(0xFF140C10) - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Expanded( - child: Container( - alignment: Alignment.center, - child: Text( - 'yellow', - style: TextStyle( - fontSize: 20.sp, - color: const Color(0xFF333333) - ) - ), - ), - ), - Container( - height: 30.h, - width: double.infinity, - decoration: BoxDecoration( - color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, - borderRadius: BorderRadius.circular(15.r), - border: Border.all( - width: 1.5, - color: const Color(0xFF140C10) - ), - ), - alignment: Alignment.center, - child: Image.asset('choose'.assetPng), - ) - ], - ), - ), - ); - }); -} \ No newline at end of file diff --git a/lib/pages/practice/topic_picture_page.dart b/lib/pages/practice/topic_picture_page.dart new file mode 100644 index 0000000..690e593 --- /dev/null +++ b/lib/pages/practice/topic_picture_page.dart @@ -0,0 +1,448 @@ +import 'package:flutter/material.dart'; +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/ow_image_widget.dart'; + +import 'bloc/topic_picture_bloc.dart'; +import 'widgets/practice_header_widget.dart'; + +class TopicPicturePage extends StatelessWidget { + const TopicPicturePage({super.key}); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => TopicPictureBloc(PageController(),3), + child: _TopicPicturePage(), + ); + } +} + +class _TopicPicturePage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, state){}, + child: _topicPictureView(), + ); + } + + Widget _topicPictureView() => BlocBuilder( + buildWhen: (_,s) => s is CurrentPageIndexState, + builder: (context,state){ + final bloc = BlocProvider.of(context); + return Container( + color: Colors.white, + child: Stack( + children: [ + Column( + children: [ + PracticeHeaderWidget( + title: '${bloc.currentPage}/8', + onTap: (){Navigator.pop(context);}, + ), + Expanded( + child: PageView.builder( + itemCount: 8, + scrollDirection: Axis.horizontal, + controller: bloc.pageController, + onPageChanged: (int index) { + bloc.add(CurrentPageIndexChangeEvent(index)); + }, + itemBuilder: (BuildContext context,int index){ + if (index % 5 == 0) { + return _pageViewWordItemWidget(); + } else if (index % 5 == 1) { + return _pageViewItemWidget(); + } else if (index % 5 == 2){ + return _pageViewVoicePictureItemWidget(); + } else if (index % 5 == 3){ + return _voiceAnswerItem(); + } else { + return _pageViewVoiceWordItemWidget(); + } + }), + ) + ], + ), + Positioned( + left: 0, + right: 0, + bottom: 0, + child: Image.asset('bottom_grass'.assetPng) + ) + ], + ), + ); + }); + + ///看题选图 + Widget _pageViewItemWidget() => BlocBuilder( + builder: (context, state){ + final bloc = BlocProvider.of(context); + return SafeArea( + child: Column( + children: [ + Text( + 'What to do when the sentence question is very long and needs a line break', + softWrap: true, + style: TextStyle( + fontSize: 21.sp, + color: const Color(0xFF333333) + ) + ), + 26.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Offstage( + offstage: (bloc.modelCount < 1), + child: _decodeImageWidget(1), + ), + Offstage( + offstage: (bloc.modelCount < 2), + child: _decodeImageWidget(2), + ), + Offstage( + offstage: (bloc.modelCount < 3), + child: _decodeImageWidget(3), + ), + Offstage( + offstage: (bloc.modelCount < 4), + child: _decodeImageWidget(4), + ) + ], + ) + ], + ), + ); + }); + + Widget _decodeImageWidget(int index) => BlocBuilder( + buildWhen: (_, s) => s is SelectItemChangeState, + builder: (context,state){ + final bloc = BlocProvider.of(context); + return GestureDetector( + onTap: () => bloc.add(SelectItemEvent(index)), + child: Container( + padding: const EdgeInsets.all(4.5), + decoration: BoxDecoration( + color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, + borderRadius: BorderRadius.circular(15), + ), + height: 143.h, + width: 143.w, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all( + width: 1.0, + color: const Color(0xFF140C10) + ), + image: const DecorationImage( + fit: BoxFit.fitWidth, + image: NetworkImage('https://img1.baidu.com/it/u=3392591833,1640391553&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=714') + ) + ), + ), + ), + ); + }); + + ///看题选字 + Widget _pageViewWordItemWidget() => BlocBuilder( + builder: (context, state){ + final bloc = BlocProvider.of(context); + return SafeArea( + child: Column( + children: [ + Text( + 'What to do when the sentence question is very long and needs a line break', + softWrap: true, + style: TextStyle( + fontSize: 21.sp, + color: const Color(0xFF333333) + ) + ), + 26.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Offstage( + offstage: (bloc.modelCount < 1), + child: _decodeWordWidget(1), + ), + Offstage( + offstage: (bloc.modelCount < 2), + child: _decodeWordWidget(2), + ), + Offstage( + offstage: (bloc.modelCount < 3), + child: _decodeWordWidget(3), + ), + Offstage( + offstage: (bloc.modelCount < 4), + child: _decodeWordWidget(4), + ) + ], + ) + ], + ), + ); + }); + + Widget _decodeWordWidget(int index) => BlocBuilder( + buildWhen: (_, s) => s is SelectItemChangeState, + builder: (context,state){ + final bloc = BlocProvider.of(context); + return GestureDetector( + onTap: () => bloc.add(SelectItemEvent(index)), + child: Container( + width: 143.w, + height: 143.h, + padding: EdgeInsets.only(left: 13.w,right: 13.w,top: 13.h,bottom: 13.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all( + width: 1.0, + color: const Color(0xFF140C10) + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: Container( + alignment: Alignment.center, + child: Text( + 'yellow', + style: TextStyle( + fontSize: 20.sp, + color: const Color(0xFF333333) + ) + ), + ), + ), + Container( + height: 30.h, + width: double.infinity, + decoration: BoxDecoration( + color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, + borderRadius: BorderRadius.circular(15.r), + border: Border.all( + width: 1.5, + color: const Color(0xFF140C10) + ), + ), + alignment: Alignment.center, + child: Image.asset('choose'.assetPng), + ) + ], + ), + ), + ); + }); + + ///听音选图 + Widget _pageViewVoicePictureItemWidget() => BlocBuilder( + builder: (context, state){ + final bloc = BlocProvider.of(context); + return SafeArea( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('voice'.assetPng,height: 33.h,width: 30.w,), + 10.horizontalSpace, + Text( + 'yellow', + style: TextStyle( + fontSize: 20.sp, + color: const Color(0xFF333333) + ) + ) + ], + ), + 26.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Offstage( + offstage: (bloc.modelCount < 1), + child: _decodeVoiceImageWidget(1), + ), + Offstage( + offstage: (bloc.modelCount < 2), + child: _decodeVoiceImageWidget(2), + ), + Offstage( + offstage: (bloc.modelCount < 3), + child: _decodeVoiceImageWidget(3), + ), + Offstage( + offstage: (bloc.modelCount < 4), + child: _decodeVoiceImageWidget(4), + ) + ], + ) + ], + ), + ); + }); + + Widget _decodeVoiceImageWidget(int index) => BlocBuilder( + buildWhen: (_, s) => s is SelectItemChangeState, + builder: (context,state){ + final bloc = BlocProvider.of(context); + return GestureDetector( + onTap: () => bloc.add(SelectItemEvent(index)), + child: Container( + padding: const EdgeInsets.all(4.5), + decoration: BoxDecoration( + color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, + borderRadius: BorderRadius.circular(15), + ), + height: 143.h, + width: 143.w, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all( + width: 1.0, + color: const Color(0xFF140C10) + ), + image: const DecorationImage( + fit: BoxFit.fitWidth, + image: NetworkImage('https://img1.baidu.com/it/u=3392591833,1640391553&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=714') + ) + ), + ), + ), + ); + }); + + ///听音选字 + Widget _pageViewVoiceWordItemWidget() => BlocBuilder( + builder: (context, state){ + final bloc = BlocProvider.of(context); + return SafeArea( + child: Column( + children: [ + Image.asset('voice'.assetPng,height: 33.h,width: 30.w,), + 26.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Offstage( + offstage: (bloc.modelCount < 1), + child: _decodeVoiceWordImageWidget(1), + ), + Offstage( + offstage: (bloc.modelCount < 2), + child: _decodeVoiceWordImageWidget(2), + ), + Offstage( + offstage: (bloc.modelCount < 3), + child: _decodeVoiceWordImageWidget(3), + ), + Offstage( + offstage: (bloc.modelCount < 4), + child: _decodeVoiceWordImageWidget(4), + ) + ], + ) + ], + ), + ); + }); + + Widget _decodeVoiceWordImageWidget(int index) => BlocBuilder( + buildWhen: (_, s) => s is SelectItemChangeState, + builder: (context,state){ + final bloc = BlocProvider.of(context); + return GestureDetector( + onTap: () => bloc.add(SelectItemEvent(index)), + child: Container( + width: 143.w, + height: 143.h, + padding: EdgeInsets.only(left: 13.w,right: 13.w,top: 13.h,bottom: 13.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all( + width: 1.0, + color: const Color(0xFF140C10) + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: Container( + alignment: Alignment.center, + child: Text( + 'yellow', + style: TextStyle( + fontSize: 20.sp, + color: const Color(0xFF333333) + ) + ), + ), + ), + Container( + height: 30.h, + width: double.infinity, + decoration: BoxDecoration( + color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, + borderRadius: BorderRadius.circular(15.r), + border: Border.all( + width: 1.5, + color: const Color(0xFF140C10) + ), + ), + alignment: Alignment.center, + child: Image.asset('choose'.assetPng), + ) + ], + ), + ), + ); + }); + + ///语音问答 + Widget _voiceAnswerItem() => BlocBuilder( + builder: (context, state) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + OwImageWidget( + name:'https://up.enterdesk.com/edpic_source/16/e7/0d/16e70d550daff77cbac31fae5e1651d4.jpg', + height: 186.h, + width: 186.w, + ), + 160.horizontalSpace, + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'voice'.assetPng, + height: 52.h, + width: 46.w, + ), + 70.verticalSpace, + Image.asset( + 'micro_phone'.assetPng, + height: 75.w, + width: 75.w, + ) + ], + ) + ], + ); + }); +} \ No newline at end of file diff --git a/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_bloc.dart b/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_bloc.dart deleted file mode 100644 index 073782d..0000000 --- a/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_bloc.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -part 'voice_pic_event.dart'; -part 'voice_pic_state.dart'; - -class VoicePicBloc extends Bloc { - final PageController pageController; - - final int modelCount; - - int _currentPage = 0; - - int _selectItem = 0; - - int get currentPage => _currentPage + 1; - - int get selectItem => _selectItem; - VoicePicBloc(this.pageController, this.modelCount) : super(VoicePicInitial()) { - on(_pageControllerChange); - on(_selectItemLoad); - } - - @override - Future close() { - pageController.dispose(); - return super.close(); - } - - void _pageControllerChange(CurrentPageIndexChangeEvent event,Emitter emitter) async { - _currentPage = event.pageIndex; - emitter(CurrentPageIndexState()); - } - - void _selectItemLoad(SelectItemEvent event,Emitter emitter) async { - _selectItem = event.selectIndex; - emitter(SelectItemChangeState()); - } -} diff --git a/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_event.dart b/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_event.dart deleted file mode 100644 index c60b951..0000000 --- a/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_event.dart +++ /dev/null @@ -1,14 +0,0 @@ -part of 'voice_pic_bloc.dart'; - -@immutable -abstract class VoicePicEvent {} - -class CurrentPageIndexChangeEvent extends VoicePicEvent { - final int pageIndex; - CurrentPageIndexChangeEvent(this.pageIndex); -} - -class SelectItemEvent extends VoicePicEvent { - final int selectIndex; - SelectItemEvent(this.selectIndex); -} \ No newline at end of file diff --git a/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_state.dart b/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_state.dart deleted file mode 100644 index cd05460..0000000 --- a/lib/pages/practice/voicetopic/voicepicture/bloc/voice_pic_state.dart +++ /dev/null @@ -1,10 +0,0 @@ -part of 'voice_pic_bloc.dart'; - -@immutable -abstract class VoicePicState {} - -class VoicePicInitial extends VoicePicState {} - -class CurrentPageIndexState extends VoicePicState {} - -class SelectItemChangeState extends VoicePicState {} \ No newline at end of file diff --git a/lib/pages/practice/voicetopic/voicepicture/voice_pic_page.dart b/lib/pages/practice/voicetopic/voicepicture/voice_pic_page.dart deleted file mode 100644 index d0ef1f9..0000000 --- a/lib/pages/practice/voicetopic/voicepicture/voice_pic_page.dart +++ /dev/null @@ -1,151 +0,0 @@ -import 'package:flutter/material.dart'; -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/pages/practice/widgets/practice_header_widget.dart'; - -import 'bloc/voice_pic_bloc.dart'; - -class VoicePicPage extends StatelessWidget { - const VoicePicPage({super.key}); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => VoicePicBloc(PageController(),4), - child: _VoicePicPage(), - ); - } -} - -class _VoicePicPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state){}, - child: _voicePicView(), - ); - } - - Widget _voicePicView() => BlocBuilder( - builder: (context, state){ - return _voicePictureView(); - }); - - Widget _voicePictureView() => BlocBuilder( - buildWhen: (_,s) => s is CurrentPageIndexState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return Container( - color: Colors.white, - child: Stack( - children: [ - Image.asset( - 'road_bg'.assetPng, - height: double.infinity, - width: double.infinity - ), - Column( - children: [ - PracticeHeaderWidget( - title: '${bloc.currentPage}/8', - onTap: (){Navigator.pop(context);}, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset('voice'.assetPng,height: 33.h,width: 30.w,), - 10.horizontalSpace, - Text( - 'yellow', - style: TextStyle( - fontSize: 20.sp, - color: const Color(0xFF333333) - ) - ) - ], - ), - 26.verticalSpace, - Expanded( - child: PageView.builder( - itemCount: 8, - scrollDirection: Axis.horizontal, - controller: bloc.pageController, - onPageChanged: (int index) { - bloc.add(CurrentPageIndexChangeEvent(index)); - }, - itemBuilder: (BuildContext context,int index){ - return _pageViewItemWidget(); - }), - ) - ], - ) - ], - ), - ); - }); - - Widget _pageViewItemWidget() => BlocBuilder( - builder: (context, state){ - final bloc = BlocProvider.of(context); - return SafeArea( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Offstage( - offstage: (bloc.modelCount < 1), - child: _decodeImageWidget(1), - ), - Offstage( - offstage: (bloc.modelCount < 2), - child: _decodeImageWidget(2), - ), - Offstage( - offstage: (bloc.modelCount < 3), - child: _decodeImageWidget(3), - ), - Offstage( - offstage: (bloc.modelCount < 4), - child: _decodeImageWidget(4), - ) - ], - ) - ], - ), - ); - }); - - Widget _decodeImageWidget(int index) => BlocBuilder( - buildWhen: (_, s) => s is SelectItemChangeState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return GestureDetector( - onTap: () => bloc.add(SelectItemEvent(index)), - child: Container( - padding: const EdgeInsets.all(4.5), - decoration: BoxDecoration( - color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, - borderRadius: BorderRadius.circular(15), - ), - height: 143.h, - width: 143.w, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), - border: Border.all( - width: 1.0, - color: const Color(0xFF140C10) - ), - image: const DecorationImage( - fit: BoxFit.fitWidth, - image: NetworkImage('https://img1.baidu.com/it/u=3392591833,1640391553&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=714') - ) - ), - ), - ), - ); - }); -} \ No newline at end of file diff --git a/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_bloc.dart b/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_bloc.dart deleted file mode 100644 index c768bd4..0000000 --- a/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_bloc.dart +++ /dev/null @@ -1,41 +0,0 @@ - -import 'package:flutter/cupertino.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -part 'voice_word_event.dart'; -part 'voice_word_state.dart'; - -class VoiceWordBloc extends Bloc { - final PageController pageController; - - final int modelCount; - - int _currentPage = 0; - - int _selectItem = 0; - - int get currentPage => _currentPage + 1; - - int get selectItem => _selectItem; - VoiceWordBloc(this.pageController, this.modelCount) : super(VoiceWordInitial()) { - on(_pageControllerChange); - on(_selectItemLoad); - } - - @override - Future close() { - pageController.dispose(); - return super.close(); - } - - void _pageControllerChange(CurrentPageIndexChangeEvent event,Emitter emitter) async { - _currentPage = event.pageIndex; - emitter(CurrentPageIndexState()); - } - - void _selectItemLoad(SelectItemEvent event,Emitter emitter) async { - _selectItem = event.selectIndex; - emitter(SelectItemChangeState()); - } -} - diff --git a/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_event.dart b/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_event.dart deleted file mode 100644 index 1d556a2..0000000 --- a/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_event.dart +++ /dev/null @@ -1,14 +0,0 @@ -part of 'voice_word_bloc.dart'; - -@immutable -abstract class VoiceWordEvent {} - -class CurrentPageIndexChangeEvent extends VoiceWordEvent { - final int pageIndex; - CurrentPageIndexChangeEvent(this.pageIndex); -} - -class SelectItemEvent extends VoiceWordEvent { - final int selectIndex; - SelectItemEvent(this.selectIndex); -} \ No newline at end of file diff --git a/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_state.dart b/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_state.dart deleted file mode 100644 index 81993db..0000000 --- a/lib/pages/practice/voicetopic/voiceword/bloc/voice_word_state.dart +++ /dev/null @@ -1,10 +0,0 @@ -part of 'voice_word_bloc.dart'; - -@immutable -abstract class VoiceWordState {} - -class VoiceWordInitial extends VoiceWordState {} - -class CurrentPageIndexState extends VoiceWordState {} - -class SelectItemChangeState extends VoiceWordState {} diff --git a/lib/pages/practice/voicetopic/voiceword/voice_word_page.dart b/lib/pages/practice/voicetopic/voiceword/voice_word_page.dart deleted file mode 100644 index 144bd47..0000000 --- a/lib/pages/practice/voicetopic/voiceword/voice_word_page.dart +++ /dev/null @@ -1,160 +0,0 @@ -import 'package:flutter/material.dart'; -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/pages/practice/widgets/practice_header_widget.dart'; - -import 'bloc/voice_word_bloc.dart'; - -class VoiceWordPage extends StatelessWidget { - const VoiceWordPage({super.key}); - - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => VoiceWordBloc(PageController(),4), - child: _VoiceWordPage(), - ); - } -} - -class _VoiceWordPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state){}, - child: _voiceWorView(), - ); - } - - Widget _voiceWorView() => BlocBuilder( - builder: (context, state){ - return _voiceWordView(); - }); - - Widget _voiceWordView() => BlocBuilder( - buildWhen: (_,s) => s is CurrentPageIndexState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return Container( - color: Colors.white, - child: Stack( - children: [ - Image.asset( - 'road_bg'.assetPng, - height: double.infinity, - width: double.infinity - ), - Column( - children: [ - PracticeHeaderWidget( - title: '${bloc.currentPage}/8', - onTap: (){Navigator.pop(context);}, - ), - Image.asset('voice'.assetPng,height: 33.h,width: 30.w,), - 26.verticalSpace, - Expanded( - child: PageView.builder( - itemCount: 8, - scrollDirection: Axis.horizontal, - controller: bloc.pageController, - onPageChanged: (int index) { - bloc.add(CurrentPageIndexChangeEvent(index)); - }, - itemBuilder: (BuildContext context,int index){ - return _pageViewItemWidget(); - }), - ) - ], - ) - ], - ), - ); - }); - - Widget _pageViewItemWidget() => BlocBuilder( - builder: (context, state){ - final bloc = BlocProvider.of(context); - return SafeArea( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Offstage( - offstage: (bloc.modelCount < 1), - child: _decodeImageWidget(1), - ), - Offstage( - offstage: (bloc.modelCount < 2), - child: _decodeImageWidget(2), - ), - Offstage( - offstage: (bloc.modelCount < 3), - child: _decodeImageWidget(3), - ), - Offstage( - offstage: (bloc.modelCount < 4), - child: _decodeImageWidget(4), - ) - ], - ) - ], - ), - ); - }); - - Widget _decodeImageWidget(int index) => BlocBuilder( - buildWhen: (_, s) => s is SelectItemChangeState, - builder: (context,state){ - final bloc = BlocProvider.of(context); - return GestureDetector( - onTap: () => bloc.add(SelectItemEvent(index)), - child: Container( - width: 143.w, - height: 143.h, - padding: EdgeInsets.only(left: 13.w,right: 13.w,top: 13.h,bottom: 13.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), - border: Border.all( - width: 1.0, - color: const Color(0xFF140C10) - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Expanded( - child: Container( - alignment: Alignment.center, - child: Text( - 'yellow', - style: TextStyle( - fontSize: 20.sp, - color: const Color(0xFF333333) - ) - ), - ), - ), - Container( - height: 30.h, - width: double.infinity, - decoration: BoxDecoration( - color: bloc.selectItem == index?const Color(0xFF00B6F1):Colors.white, - borderRadius: BorderRadius.circular(15.r), - border: Border.all( - width: 1.5, - color: const Color(0xFF140C10) - ), - ), - alignment: Alignment.center, - child: Image.asset('choose'.assetPng), - ) - ], - ), - ), - ); - }); -} \ No newline at end of file diff --git a/lib/pages/repeatafter/bloc/repeat_after_bloc.dart b/lib/pages/repeatafter/bloc/repeat_after_bloc.dart index f2dfb14..c126e1e 100644 --- a/lib/pages/repeatafter/bloc/repeat_after_bloc.dart +++ b/lib/pages/repeatafter/bloc/repeat_after_bloc.dart @@ -15,17 +15,15 @@ class RepeatAfterBloc extends Bloc { List get listData => _listData; RepeatAfterBloc() : super(RepeatAfterInitial()) { - on((event, emit) { - // TODO: implement event handler - }); + on(_requestData); } - Future requestData() async { + void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { _listData = await ListenDao.followRead()??[]; - emit(RequestDataState()); + emitter(RequestDataState()); }); } catch (e) { if (e is ApiException) { diff --git a/lib/pages/repeatafter/bloc/repeat_after_event.dart b/lib/pages/repeatafter/bloc/repeat_after_event.dart index 3a46031..15799a2 100644 --- a/lib/pages/repeatafter/bloc/repeat_after_event.dart +++ b/lib/pages/repeatafter/bloc/repeat_after_event.dart @@ -2,3 +2,5 @@ part of 'repeat_after_bloc.dart'; @immutable abstract class RepeatAfterEvent {} + +class RequestDataEvent extends RepeatAfterEvent {} diff --git a/lib/pages/repeatafter/repeat_after_page.dart b/lib/pages/repeatafter/repeat_after_page.dart index 742a835..f4d9e87 100644 --- a/lib/pages/repeatafter/repeat_after_page.dart +++ b/lib/pages/repeatafter/repeat_after_page.dart @@ -13,7 +13,7 @@ class RepeatAfterPage extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => RepeatAfterBloc()..requestData(), + create: (context) => RepeatAfterBloc()..add(RequestDataEvent()), child: _RepeatAfterPageView(), ); } diff --git a/lib/pages/video/lookvideo/look_video_page.dart b/lib/pages/video/lookvideo/look_video_page.dart index 716cfec..6282cf3 100644 --- a/lib/pages/video/lookvideo/look_video_page.dart +++ b/lib/pages/video/lookvideo/look_video_page.dart @@ -1,13 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wow_english/pages/video/lookvideo/widgets/video_widget.dart'; -import 'bloc/look_video_bloc.dart'; - class LookVideoPage extends StatefulWidget { - const LookVideoPage({super.key, this.videoUrl}); + const LookVideoPage({super.key, this.videoUrl, this.typeTitle}); final String? videoUrl; + final String? typeTitle; @override State createState() { @@ -20,23 +18,7 @@ class _LookVideoPageState extends State { Widget build(BuildContext context) { return VideoWidget( videoUrl: widget.videoUrl??'', + typeTitle: widget.typeTitle, ); } -} - -class _LookVideoPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context,state){}, - child: _lookVideoView(), - ); - } - - Widget _lookVideoView() => BlocBuilder( - builder: (context,state){ - return const VideoWidget( - videoUrl: 'https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/7194236f31b2e1e3da0fe06cfed4ba2b.mp4', - ); - }); } \ No newline at end of file diff --git a/lib/pages/video/lookvideo/widgets/video_opera_widget.dart b/lib/pages/video/lookvideo/widgets/video_opera_widget.dart index 6f667a0..62c2669 100644 --- a/lib/pages/video/lookvideo/widgets/video_opera_widget.dart +++ b/lib/pages/video/lookvideo/widgets/video_opera_widget.dart @@ -20,7 +20,8 @@ class VideoOperaWidget extends StatefulWidget { this.degree = 0.0, this.actionEvent, this.sliderChangeEvent, - this.isPlay = true + this.isPlay = true, + this.title = 'song', }); //当前播放时间 final String currentTime; @@ -28,6 +29,7 @@ class VideoOperaWidget extends StatefulWidget { final String totalTime; final double degree; final bool isPlay; + final String title; final Function(OperationType type)? actionEvent; final Function(double degree)? sliderChangeEvent; @@ -90,7 +92,7 @@ class _VideoOperaWidgetState extends State { ), padding: EdgeInsets.symmetric(horizontal: 10.w), child: Text( - 'song', + widget.title, textAlign: TextAlign.center, style: TextStyle( fontSize: 20.sp, @@ -100,31 +102,31 @@ class _VideoOperaWidgetState extends State { ) ], ), - GestureDetector( - onTap: () { - widget.actionEvent?.call(OperationType.subtitlesState); - }, - child: Container( - height: 40.h, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(6.r), - border: Border.all( - width: 1.5, - color: const Color(0xFF140C10) - ) - ), - padding: EdgeInsets.symmetric(horizontal: 10.w), - child: Text( - '中/英', - style: TextStyle( - fontSize: 20.sp, - color: const Color(0xFF333333), - ), - ), - ), - ) + // GestureDetector( + // onTap: () { + // widget.actionEvent?.call(OperationType.subtitlesState); + // }, + // child: Container( + // height: 40.h, + // alignment: Alignment.center, + // decoration: BoxDecoration( + // color: Colors.white, + // borderRadius: BorderRadius.circular(6.r), + // border: Border.all( + // width: 1.5, + // color: const Color(0xFF140C10) + // ) + // ), + // padding: EdgeInsets.symmetric(horizontal: 10.w), + // child: Text( + // '中/英', + // style: TextStyle( + // fontSize: 20.sp, + // color: const Color(0xFF333333), + // ), + // ), + // ), + // ) ], ), ), diff --git a/lib/pages/video/lookvideo/widgets/video_widget.dart b/lib/pages/video/lookvideo/widgets/video_widget.dart index 8238703..82dde51 100644 --- a/lib/pages/video/lookvideo/widgets/video_widget.dart +++ b/lib/pages/video/lookvideo/widgets/video_widget.dart @@ -7,9 +7,10 @@ import 'package:wow_english/common/extension/string_extension.dart'; import 'video_opera_widget.dart'; class VideoWidget extends StatefulWidget { - const VideoWidget({super.key, this.videoUrl = ''}); + const VideoWidget({super.key, this.videoUrl = '',this.typeTitle}); final String videoUrl; + final String? typeTitle; @override State createState() { @@ -53,9 +54,6 @@ class _VideoWidgetState extends State { timerUtil = TimerUtil(mInterval: 1000,mTotalTime: 1000*10); timerUtil!.setOnTimerTickCallback((int tick) { double currentTick = tick / 1000; - if (kDebugMode) { - print(currentTick); - } if (currentTick.toInt() == 0) {//倒计时结束 setState(() { _hiddenTipView = true; @@ -148,9 +146,10 @@ class _VideoWidgetState extends State { Offstage( offstage: _hiddenTipView, child: VideoOperaWidget( - currentTime: _currentTime, - totalTime: _totalTime, + title: widget.typeTitle??'song', degree: _playDegree, + totalTime: _totalTime, + currentTime: _currentTime, isPlay: _controller!.value.isPlaying, actionEvent: (OperationType type) { actionType(type); diff --git a/lib/pages/voiceanswer/bloc/voice_answer_bloc.dart b/lib/pages/voiceanswer/bloc/voice_answer_bloc.dart deleted file mode 100644 index 745bb16..0000000 --- a/lib/pages/voiceanswer/bloc/voice_answer_bloc.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -part 'voice_answer_event.dart'; -part 'voice_answer_state.dart'; - -class VoiceAnswerBloc extends Bloc { - VoiceAnswerBloc() : super(VoiceAnswerInitial()) { - on((event, emit) { - // TODO: implement event handler - }); - } -} diff --git a/lib/pages/voiceanswer/bloc/voice_answer_event.dart b/lib/pages/voiceanswer/bloc/voice_answer_event.dart deleted file mode 100644 index e18461e..0000000 --- a/lib/pages/voiceanswer/bloc/voice_answer_event.dart +++ /dev/null @@ -1,4 +0,0 @@ -part of 'voice_answer_bloc.dart'; - -@immutable -abstract class VoiceAnswerEvent {} diff --git a/lib/pages/voiceanswer/bloc/voice_answer_state.dart b/lib/pages/voiceanswer/bloc/voice_answer_state.dart deleted file mode 100644 index 07b6716..0000000 --- a/lib/pages/voiceanswer/bloc/voice_answer_state.dart +++ /dev/null @@ -1,6 +0,0 @@ -part of 'voice_answer_bloc.dart'; - -@immutable -abstract class VoiceAnswerState {} - -class VoiceAnswerInitial extends VoiceAnswerState {} diff --git a/lib/pages/voiceanswer/voice_answer_page.dart b/lib/pages/voiceanswer/voice_answer_page.dart deleted file mode 100644 index d7b347f..0000000 --- a/lib/pages/voiceanswer/voice_answer_page.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; -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/pages/practice/widgets/practice_header_widget.dart'; - -import 'bloc/voice_answer_bloc.dart'; - -class VoiceAnswerPage extends StatelessWidget { - const VoiceAnswerPage({super.key}); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => VoiceAnswerBloc(), - child: _VoiceAnswerPage(), - ); - } -} - -class _VoiceAnswerPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state) {}, - child: _voiceAnswerView(), - ); - } - - Widget _voiceAnswerView() => BlocBuilder( - builder: (context, state) { - final bloc = BlocProvider.of(context); - return Container( - color: Colors.white, - child: Stack( - children: [ - Positioned( - left: 0, - right: 0, - bottom: 0, - child: Image.asset( - 'bottom_grass'.assetPng, - fit: BoxFit.fitWidth, - )), - Column( - children: [ - PracticeHeaderWidget( - title: '1/8', - onTap: () { - Navigator.pop(context); - }, - ), - Expanded( - child: PageView.builder( - itemCount: 10, - itemBuilder: (context, int index) { - return _voiceAnswerItem(); - })) - ], - ) - ], - ), - ); - }); - - Widget _voiceAnswerItem() => BlocBuilder(builder: (context, state) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.network( - 'https://img.liblibai.com/web/648331d5a2cb5.png?image_process=format,webp&x-oss-process=image/resize,w_2980,m_lfit/format,webp', - height: 186.h, - width: 186.w, - ), - 160.horizontalSpace, - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'voice'.assetPng, - height: 52.h, - width: 46.w, - ), - 70.verticalSpace, - Image.asset( - 'micro_phone'.assetPng, - height: 75.w, - width: 75.w, - ) - ], - ) - ], - ); - }); -} diff --git a/lib/route/route.dart b/lib/route/route.dart index 6e1ec33..4a3a353 100644 --- a/lib/route/route.dart +++ b/lib/route/route.dart @@ -8,10 +8,7 @@ import 'package:wow_english/pages/listen/listen_page.dart'; import 'package:wow_english/pages/login/forgetpwd/forget_password_home_page.dart'; import 'package:wow_english/pages/login/loginpage/login_page.dart'; import 'package:wow_english/pages/login/setpwd/set_pwd_page.dart'; -import 'package:wow_english/pages/practice/chosetopic/topicpicture/topic_picture_page.dart'; -import 'package:wow_english/pages/practice/chosetopic/topicword/topic_word_page.dart'; -import 'package:wow_english/pages/practice/voicetopic/voicepicture/voice_pic_page.dart'; -import 'package:wow_english/pages/practice/voicetopic/voiceword/voice_word_page.dart'; +import 'package:wow_english/pages/practice/topic_picture_page.dart'; import 'package:wow_english/pages/repeatafter/repeat_after_page.dart'; import 'package:wow_english/pages/shop/exchane/exchange_lesson_page.dart'; import 'package:wow_english/pages/shop/exchangelist/exchange_lesson_list_page.dart'; @@ -19,7 +16,6 @@ import 'package:wow_english/pages/shop/home/shop_home_page.dart'; import 'package:wow_english/pages/tab/tab_page.dart'; import 'package:wow_english/pages/user/user_page.dart'; import 'package:wow_english/pages/video/lookvideo/look_video_page.dart'; -import 'package:wow_english/pages/voiceanswer/voice_answer_page.dart'; import '../pages/reading/reading_page.dart'; @@ -87,17 +83,10 @@ class AppRouter { return CupertinoPageRoute(builder: (_) => const UserPage()); case AppRouteName.topicPic: return CupertinoPageRoute(builder: (_) => const TopicPicturePage()); - case AppRouteName.topicWord: - return CupertinoPageRoute(builder: (_) => const TopicWordPage()); - case AppRouteName.voicePic: - return CupertinoPageRoute(builder: (_) => const VoicePicPage()); - case AppRouteName.voiceWord: - return CupertinoPageRoute(builder: (_) => const VoiceWordPage()); - case AppRouteName.voiceAnswer: - return CupertinoPageRoute(builder: (_) => const VoiceAnswerPage()); case AppRouteName.lookVideo: final videoUrl = (settings.arguments as Map)['videoUrl'] as String; - return CupertinoPageRoute(builder: (_) => LookVideoPage(videoUrl: videoUrl,)); + final title = (settings.arguments as Map)['title'] as String?; + return CupertinoPageRoute(builder: (_) => LookVideoPage(videoUrl: videoUrl,typeTitle: title,)); case AppRouteName.setPwd: final phoneNum = (settings.arguments as Map)['phoneNumber'] as String; return CupertinoPageRoute(builder: (_) => SetPassWordPage(phoneNum: phoneNum)); -- libgit2 0.22.2