diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index d686bc1..5eb4cfe 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 48BCA0827DCB98991774F5AC /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 52450AF02A4C415B007B3E4B /* XSMessageMehtodChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XSMessageMehtodChannel.swift; sourceTree = ""; }; + 52450AF22A4ED0EC007B3E4B /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 525E17192A4BD03900104CDF /* VoiceXSMessageChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceXSMessageChannel.swift; sourceTree = ""; }; 6DEBBC1D861BE053F3ECE0B9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; @@ -147,6 +148,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 52450AF22A4ED0EC007B3E4B /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -492,6 +494,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = T8P9KW8GWH; ENABLE_BITCODE = NO; @@ -671,6 +674,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = T8P9KW8GWH; ENABLE_BITCODE = NO; @@ -694,6 +698,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = T8P9KW8GWH; ENABLE_BITCODE = NO; diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/lib/app/splash_page.dart b/lib/app/splash_page.dart index 8e979cd..72c8c23 100644 --- a/lib/app/splash_page.dart +++ b/lib/app/splash_page.dart @@ -36,9 +36,9 @@ class _TransitionViewState extends State { Timer(const Duration(seconds: 2), () { if (userEntity != null) { // todo 调一下接口判断一下有效性再往下 - Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); + pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); } else { - Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); + pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); } }); } diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 1f8609a..17588a2 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -29,15 +29,15 @@ class HomePage extends StatelessWidget { class _HomePageView extends StatelessWidget { void _headerActionEvent(HeaderActionType type) { if (type == HeaderActionType.video) { - Navigator.of(AppRouter.context).pushNamed(AppRouteName.reAfter); + pushNamed(AppRouteName.reAfter); } else if (type == HeaderActionType.phase) { - Navigator.of(AppRouter.context).pushNamed(AppRouteName.lesson); + pushNamed(AppRouteName.lesson); } else if (type == HeaderActionType.listen) { - Navigator.of(AppRouter.context).pushNamed(AppRouteName.listen); + pushNamed(AppRouteName.listen); } else if (type == HeaderActionType.shop) { - Navigator.of(AppRouter.context).pushNamed(AppRouteName.shop); + pushNamed(AppRouteName.shop); } else if (type == HeaderActionType.user) { - Navigator.of(AppRouter.context).pushNamed(AppRouteName.user); + pushNamed(AppRouteName.user); } else { } @@ -66,7 +66,7 @@ class _HomePageView extends StatelessWidget { if (videoUrl.isEmpty) { return; } - Navigator.of(context).pushNamed(AppRouteName.lookVideo,arguments: {'videoUrl':videoUrl,'title':title}); + pushNamed(AppRouteName.lookVideo,arguments: {'videoUrl':videoUrl,'title':title}); } }, child: _homeView(), @@ -74,100 +74,100 @@ class _HomePageView extends StatelessWidget { } Widget _homeView() => BlocBuilder(builder: (context, state) { - final bloc = BlocProvider.of(context); - return Scaffold( - body: Container( - color: Colors.white, - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - HomeTabHeaderWidget( - actionTap: (HeaderActionType type) { - _headerActionEvent(type); - }, - ), - Expanded( - child: ListView.builder( - itemCount: bloc.modelData?.totalCourseLesson, - scrollDirection: Axis.horizontal, - itemBuilder: (BuildContext context, int index) { - CourseCourseLessons? data = bloc.modelData?.courseLessons?[index]; - if (data?.courseType == 5) { - //彩蛋 - return GestureDetector( - onTap: () { - if (data!.lock!) { - showToast('当前课程暂未解锁'); - return; - } - bloc.add(RequestVideoLessonEvent(data.id!,data.courseType!)); - }, - child: HomeBoundsItem( - imageUrl: data?.coverUrl, - ), - ); - } else { - return GestureDetector( - onTap: () { - debugPrint('>>>>>>>类型${data?.courseType}'); - if (data!.lock!) { - showToast('当前课程暂未解锁'); - return; - } - if (data.courseType == 4) {//绘本 - return; - } + final bloc = BlocProvider.of(context); + return Scaffold( + body: Container( + color: Colors.white, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + HomeTabHeaderWidget( + actionTap: (HeaderActionType type) { + _headerActionEvent(type); + }, + ), + Expanded( + child: ListView.builder( + itemCount: bloc.modelData?.totalCourseLesson, + scrollDirection: Axis.horizontal, + itemBuilder: (BuildContext context, int index) { + CourseCourseLessons? data = bloc.modelData?.courseLessons?[index]; + if (data?.courseType == 5) { + //彩蛋 + return GestureDetector( + onTap: () { + if (data!.lock!) { + showToast('当前课程暂未解锁'); + return; + } + bloc.add(RequestVideoLessonEvent(data.id!,data.courseType!)); + }, + child: HomeBoundsItem( + imageUrl: data?.coverUrl, + ), + ); + } else { + return GestureDetector( + onTap: () { + debugPrint('>>>>>>>类型${data?.courseType}'); + if (data!.lock!) { + showToast('当前课程暂未解锁'); + return; + } + if (data.courseType == 4) {//绘本 + return; + } - if (data.courseType == 3) {//练习 - Navigator.of(context).pushNamed(AppRouteName.topicPic,arguments: {'courseLessonId':data.id!}); - return; - } + if (data.courseType == 3) {//练习 + Navigator.of(context).pushNamed(AppRouteName.topicPic,arguments: {'courseLessonId':data.id!}); + return; + } - //儿歌/看视频 - bloc.add(RequestVideoLessonEvent(data.id!,data.courseType!)); - }, - child: HomeVideoItem( - lessons: data, - ), - ); - } - })), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 13.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - height: 47.h, - width: 80.w, - ), - Container( - decoration: BoxDecoration( - color: Colors.blue, - borderRadius: BorderRadius.circular(14.5.r), - ), - padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 24.w), - child: Text( - '${(bloc.modelData?.nowCourseLesson)}/${bloc.modelData?.totalCourseLesson}', - style: TextStyle(color: Colors.white, fontSize: 12.sp), + //儿歌/看视频 + bloc.add(RequestVideoLessonEvent(data.id!,data.courseType!)); + }, + child: HomeVideoItem( + lessons: data, ), - ), - Image.asset( - 'blue-positive'.assetPng, - height: 47.h, - width: 80.w, - // color: Colors.red, - ), - ], + ); + } + })), + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 13.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + height: 47.h, + width: 80.w, ), - ), - ) - ], - ), - ), + Container( + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(14.5.r), + ), + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 24.w), + child: Text( + '${(bloc.modelData?.nowCourseLesson)}/${bloc.modelData?.totalCourseLesson}', + style: TextStyle(color: Colors.white, fontSize: 12.sp), + ), + ), + Image.asset( + 'blue-positive'.assetPng, + height: 47.h, + width: 80.w, + // color: Colors.red, + ), + ], + ), + ), + ) + ], ), - ); - }); + ), + ), + ); + }); } diff --git a/lib/pages/lessons/lesson_page.dart b/lib/pages/lessons/lesson_page.dart index b31bad6..41479e1 100644 --- a/lib/pages/lessons/lesson_page.dart +++ b/lib/pages/lessons/lesson_page.dart @@ -171,7 +171,7 @@ class _LessonPageView extends StatelessWidget { model: model, isSelected: bloc.currentPageIndex == index, onClickEvent: () { - Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false,arguments: {'moduleId':model?.id}); + pushNamedAndRemoveUntil(AppRouteName.home, (route) => false,arguments: {'moduleId':model?.id}); }, ), ), diff --git a/lib/pages/login/loginpage/login_page.dart b/lib/pages/login/loginpage/login_page.dart index 14edaea..2e1b776 100644 --- a/lib/pages/login/loginpage/login_page.dart +++ b/lib/pages/login/loginpage/login_page.dart @@ -30,7 +30,7 @@ class _LoginPageView extends StatelessWidget { if (state is LoginResultChangeState) { // 调试用 // Navigator.of(context).pushNamed(AppRouteName.home); - Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); + pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); } }, child: _buildLoginViewWidget(), diff --git a/lib/pages/login/setpwd/set_pwd_page.dart b/lib/pages/login/setpwd/set_pwd_page.dart index 34df466..c81dd51 100644 --- a/lib/pages/login/setpwd/set_pwd_page.dart +++ b/lib/pages/login/setpwd/set_pwd_page.dart @@ -57,7 +57,7 @@ class _SetPassWordPageView extends StatelessWidget { } else { showToast('密码修改成功'); } - Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); + pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); } else if (state is PasswordSetFailedState) { state.message.toast(); } diff --git a/lib/pages/repeatafter/repeat_after_page.dart b/lib/pages/repeatafter/repeat_after_page.dart index fdd07cb..bd6cd37 100644 --- a/lib/pages/repeatafter/repeat_after_page.dart +++ b/lib/pages/repeatafter/repeat_after_page.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wow_english/common/widgets/we_app_bar.dart'; import 'package:wow_english/models/follow_read_entity.dart'; import 'package:wow_english/pages/repeatafter/widgets/repeat_after_item.dart'; -import 'package:wow_english/utils/toast_util.dart'; +import 'package:wow_english/route/route.dart'; import 'bloc/repeat_after_bloc.dart'; @@ -24,9 +24,7 @@ class _RepeatAfterPageView extends StatelessWidget { Widget build(BuildContext context) { return BlocListener( listener: (context, state) { - if (state is RequestDataState) { - showToast('网络请求结束'); - } + }, child: _repeatAfterView(), ); @@ -49,7 +47,9 @@ class _RepeatAfterPageView extends StatelessWidget { itemBuilder: (BuildContext context, int index) { FollowReadEntity? entity = bloc.listData[index]; return RepeatAfterItem( - tapEvent: () {}, + tapEvent: () { + pushNamed(AppRouteName.readAfterContent); + }, entity: entity, ); }), diff --git a/lib/pages/repeatafter/widgets/repeat_after_item.dart b/lib/pages/repeatafter/widgets/repeat_after_item.dart index 39f78ef..4cbd1b8 100644 --- a/lib/pages/repeatafter/widgets/repeat_after_item.dart +++ b/lib/pages/repeatafter/widgets/repeat_after_item.dart @@ -5,11 +5,11 @@ import 'package:wow_english/common/widgets/ow_image_widget.dart'; import 'package:wow_english/models/follow_read_entity.dart'; class RepeatAfterItem extends StatelessWidget { - const RepeatAfterItem({super.key, required this.tapEvent, this.entity}); + const RepeatAfterItem({super.key, this.tapEvent, this.entity}); final FollowReadEntity? entity; - final Function() tapEvent; + final Function()? tapEvent; @override Widget build(BuildContext context) { @@ -20,8 +20,8 @@ class RepeatAfterItem extends StatelessWidget { child: GestureDetector( onTap: (){ if (entity != null) { - if (entity?.lock??false) { - tapEvent(); + if (!entity!.lock!) { + tapEvent?.call(); } } }, diff --git a/lib/pages/repeataftercontent/repeat_after_content_page.dart b/lib/pages/repeataftercontent/repeat_after_content_page.dart new file mode 100644 index 0000000..fc6617b --- /dev/null +++ b/lib/pages/repeataftercontent/repeat_after_content_page.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:wow_english/common/extension/string_extension.dart'; +import 'package:wow_english/route/route.dart'; + +class RepeatAfterContentPage extends StatelessWidget { + const RepeatAfterContentPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: SafeArea( + child: Stack( + children: [ + Positioned( + top: 13.h, + child: GestureDetector( + onTap: () => popPage(), + child: Image.asset( + 'back_around'.assetPng, + height: 40.h, + width: 40.w, + ), + ), + ) + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/route/route.dart b/lib/route/route.dart index 3b0aba6..eee4b75 100644 --- a/lib/route/route.dart +++ b/lib/route/route.dart @@ -10,6 +10,7 @@ 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/topic_picture_page.dart'; import 'package:wow_english/pages/repeatafter/repeat_after_page.dart'; +import 'package:wow_english/pages/repeataftercontent/repeat_after_content_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'; import 'package:wow_english/pages/shop/home/shop_home_page.dart'; @@ -40,10 +41,14 @@ class AppRouteName { /// 用户详细信息页 static const String userInformation = 'userInformation'; + ///看视频 static const String lookVideo = 'lookVideo'; + ///绘本 static const String reading = 'reading'; + ///视频跟读详情 + static const String readAfterContent = 'readAfterContent'; + - ///绘本 static const String tab = '/'; } @@ -123,6 +128,9 @@ class AppRouter { urlStr: urlStr, webViewTitle: webViewTitle, )); + case AppRouteName.readAfterContent: + return CupertinoPageRoute( + builder: (_) => const RepeatAfterContentPage()); case AppRouteName.tab: return PageRouteBuilder( opaque: false, @@ -138,3 +146,16 @@ class AppRouter { } } } + +void pushNamed(String routeName, {Object? arguments}) { + Navigator.of(AppRouter.context).pushNamed(routeName,arguments: arguments); +} + +void pushNamedAndRemoveUntil(String routeName,RoutePredicate predicate, {Object? arguments}) { + Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(routeName, predicate,arguments: arguments); +} + +void popPage() { + Navigator.pop(AppRouter.context); +} +