From c61b3c1a909cee3732835372efabdf93abe09772 Mon Sep 17 00:00:00 2001 From: Key Date: Wed, 28 Jun 2023 15:53:19 +0800 Subject: [PATCH] feat: toast_util.dart fixed: user_page.dart --- lib/common/core/app_consts.dart | 12 ++++++++++++ lib/pages/home/bloc/home_bloc.dart | 8 ++++---- lib/pages/home/home_page.dart | 85 ++++++++++++++++++++++++++++++++++++++++--------------------------------------------- lib/pages/home/widgets/home_tab_header_widget.dart | 64 +++++++++++++++++++++++----------------------------------------- lib/pages/lessons/bloc/lesson_bloc.dart | 12 +++++------- lib/pages/lessons/lesson_page.dart | 4 ++-- lib/pages/listen/bloc/listen_bloc.dart | 14 +++++--------- lib/pages/login/forgetpwd/bloc/forget_pwd_home_bloc.dart | 16 +++++++--------- lib/pages/login/forgetpwd/forget_password_home_page.dart | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------- lib/pages/login/loginpage/bloc/login_bloc.dart | 13 ++++++------- lib/pages/login/loginpage/login_page.dart | 3 ++- lib/pages/login/setpwd/bloc/set_pwd_bloc.dart | 8 +++++--- lib/pages/login/setpwd/set_pwd_page.dart | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------ lib/pages/repeatafter/bloc/repeat_after_bloc.dart | 9 ++++----- lib/pages/repeatafter/repeat_after_page.dart | 55 ++++++++++++++++++++++++++----------------------------- lib/pages/shop/exchane/exchange_lesson_page.dart | 39 ++++++++++++++------------------------- lib/pages/shop/home/shop_home_page.dart | 99 +++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------- lib/pages/user/bloc/user_bloc.dart | 10 +++------- lib/pages/user/bloc/user_event.dart | 3 +-- lib/pages/user/bloc/user_state.dart | 5 +++-- lib/pages/user/user_page.dart | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------ lib/route/route.dart | 29 ++++++++++++++++++++++++----- lib/utils/toast_util.dart | 18 ++++++++++++++++++ 23 files changed, 547 insertions(+), 521 deletions(-) create mode 100644 lib/common/core/app_consts.dart create mode 100644 lib/utils/toast_util.dart diff --git a/lib/common/core/app_consts.dart b/lib/common/core/app_consts.dart new file mode 100644 index 0000000..52b5cd3 --- /dev/null +++ b/lib/common/core/app_consts.dart @@ -0,0 +1,12 @@ +class AppConsts { + /// 隐私协议 + static const String userPrivacyPolicyUrl = + 'http://page.kouyuxingqiu.com/%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%E5%8F%8A%E4%BD%BF%E7%94%A8APP%E9%9A%90%E7%A7%81%E5%8D%8F%E8%AE%AE.html'; + + /// 儿童隐私协议 + static const String childrenPrivacyPolicyUrl = + 'https://ishowedu-public-images.ishowedu.com/%E5%8F%A3%E8%AF%AD%E6%98%9F%E7%90%83%E5%84%BF%E7%AB%A5%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4%E6%94%BF%E7%AD%96_iShowLD%E4%BF%AE%E8%AE%A2_20210913%281%29.html'; + + /// 与第三方共享协议 + static const String userTermSdkUrl = 'http://page.kouyuxingqiu.com/term_sdk.html'; +} diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index 8cd3a80..eaf8c3c 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -1,12 +1,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.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_entity.dart'; // import 'package:wow_english/models/course_lesson_entity.dart'; import 'package:wow_english/utils/loading.dart'; +import 'package:wow_english/utils/toast_util.dart'; part 'home_event.dart'; part 'home_state.dart'; @@ -15,6 +15,7 @@ class HomeBloc extends Bloc { final String? moduleId; CourseEntity? _modelData; + CourseEntity? get modelData => _modelData; HomeBloc(this.moduleId) : super(HomeInitial()) { @@ -24,14 +25,13 @@ class HomeBloc extends Bloc { void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { - _modelData = await HomeDao.courseLesson(moduleId: moduleId??''); + _modelData = await HomeDao.courseLesson(moduleId: moduleId ?? ''); emitter(HomeDataLoadState()); }); } catch (e) { if (e is ApiException) { - EasyLoading.showToast(e.message.toString()); + showToast(e.message.toString()); } } } } - diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index d8ee0f7..8edd735 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_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/models/course_entity.dart'; @@ -8,6 +7,7 @@ import 'package:wow_english/pages/home/widgets/home_bouns_item.dart'; import 'package:wow_english/pages/home/widgets/home_tab_header_widget.dart'; import 'package:wow_english/pages/home/widgets/home_vidoe_item.dart'; import 'package:wow_english/route/route.dart'; +import 'package:wow_english/utils/toast_util.dart'; import 'bloc/home_bloc.dart'; @@ -37,8 +37,7 @@ 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.topicPic); - // Navigator.of(AppRouter.context).pushNamed(AppRouteName.user); + Navigator.of(AppRouter.context).pushNamed(AppRouteName.user); } else { // Navigator.of(AppRouter.context).pushNamed(AppRouteName.topicPic); // Navigator.of(AppRouter.context).pushNamed(AppRouteName.topicWord); @@ -51,19 +50,18 @@ class _HomePageView extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( - listener: (context, state){}, + return BlocListener( + listener: (context, state) {}, child: _homeView(), ); } - Widget _homeView() => BlocBuilder( - builder: (context, state){ + Widget _homeView() => BlocBuilder(builder: (context, state) { final bloc = BlocProvider.of(context); return Scaffold( body: Container( color: Colors.white, - child: Center( + child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -73,38 +71,38 @@ class _HomePageView extends StatelessWidget { }, ), 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!) { - return; - } - EasyLoading.showToast('点击事件'); - }, - child: HomeBoundsItem( - imageUrl: data?.coverUrl, - ), - ); - } else { - return GestureDetector( - onTap: () { - if (data!.lock!) { - return; - } - EasyLoading.showToast('点击事件'); - }, - child: HomeVideoItem( - lessons: data, - ), - ); - } - }) - ), + 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!) { + return; + } + showToast('点击事件'); + }, + child: HomeBoundsItem( + imageUrl: data?.coverUrl, + ), + ); + } else { + return GestureDetector( + onTap: () { + if (data!.lock!) { + return; + } + showToast('点击事件'); + }, + child: HomeVideoItem( + lessons: data, + ), + ); + } + })), SafeArea( child: Padding( padding: EdgeInsets.symmetric(horizontal: 13.w), @@ -120,13 +118,10 @@ class _HomePageView extends StatelessWidget { color: Colors.blue, borderRadius: BorderRadius.circular(14.5.r), ), - padding: EdgeInsets.symmetric(vertical: 8.h,horizontal: 24.w), + 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 - ), + style: TextStyle(color: Colors.white, fontSize: 12.sp), ), ), Image.asset( diff --git a/lib/pages/home/widgets/home_tab_header_widget.dart b/lib/pages/home/widgets/home_tab_header_widget.dart index 548dad5..4e21be7 100644 --- a/lib/pages/home/widgets/home_tab_header_widget.dart +++ b/lib/pages/home/widgets/home_tab_header_widget.dart @@ -18,8 +18,7 @@ enum HeaderActionType { } class HomeTabHeaderWidget extends StatelessWidget { - - const HomeTabHeaderWidget({super.key, this.actionTap}); + const HomeTabHeaderWidget({super.key, this.actionTap}); final Function(HeaderActionType type)? actionTap; @@ -34,11 +33,7 @@ class HomeTabHeaderWidget extends StatelessWidget { children: [ ScreenUtil().bottomBarHeight.horizontalSpace, GestureDetector( - onTap: () { - if(actionTap != null) { - actionTap!(HeaderActionType.user); - } - }, + onTap: () => actionTap?.call(HeaderActionType.user), child: Container( decoration: BoxDecoration( border: Border.all( @@ -50,14 +45,15 @@ class HomeTabHeaderWidget extends StatelessWidget { child: CircleAvatar( radius: 21, backgroundImage: NetworkImage( - context.read().userEntity?.avatarUrl??'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Faa1c2213-820a-4223-8757-5f8cee318a28%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1688713226&t=192b18a613683bcdc5bd76f65c9ff032', + context.read().userEntity?.avatarUrl ?? + 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Faa1c2213-820a-4223-8757-5f8cee318a28%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1688713226&t=192b18a613683bcdc5bd76f65c9ff032', ), ), ), ), GestureDetector( onTap: () { - if(actionTap != null) { + if (actionTap != null) { actionTap!(HeaderActionType.user); } }, @@ -67,56 +63,42 @@ class HomeTabHeaderWidget extends StatelessWidget { decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(2), - border: Border.all( - width: 1.0, - color: const Color(0xFF140C10), - style: BorderStyle.solid - ), + border: Border.all(width: 1.0, color: const Color(0xFF140C10), style: BorderStyle.solid), ), - child: Text( - context.read().userEntity?.name??'', - style: TextStyle( - color: const Color(0xFF333333), - fontSize: 16.sp - ), + child: Text( + context.read().userEntity?.name ?? '', + style: TextStyle(color: const Color(0xFF333333), fontSize: 16.sp), ), ), ), 20.horizontalSpace, const Expanded( - child:Text( - 'learn wow!yellow', - textAlign:TextAlign.left, - style: TextStyle( - color: Colors.white, - fontSize: 30.0 - ), - ) - ), + child: Text( + 'learn wow!yellow', + textAlign: TextAlign.left, + style: TextStyle(color: Colors.white, fontSize: 30.0), + )), IconButton( - onPressed: (){ - if(actionTap != null) { + onPressed: () { + if (actionTap != null) { actionTap!(HeaderActionType.video); } }, - icon: Image.asset('video'.assetPng) - ), + icon: Image.asset('video'.assetPng)), IconButton( - onPressed: (){ - if(actionTap != null) { + onPressed: () { + if (actionTap != null) { actionTap!(HeaderActionType.phase); } }, - icon: Image.asset('home'.assetPng) - ), + icon: Image.asset('home'.assetPng)), IconButton( - onPressed: (){ - if(actionTap != null) { + onPressed: () { + if (actionTap != null) { actionTap!(HeaderActionType.listen); } }, - icon: Image.asset('listen'.assetPng) - ), + icon: Image.asset('listen'.assetPng)), // IconButton( // onPressed: (){ // if(actionTap != null) { diff --git a/lib/pages/lessons/bloc/lesson_bloc.dart b/lib/pages/lessons/bloc/lesson_bloc.dart index 02838d3..5c4077f 100644 --- a/lib/pages/lessons/bloc/lesson_bloc.dart +++ b/lib/pages/lessons/bloc/lesson_bloc.dart @@ -1,16 +1,15 @@ 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'; import 'package:wow_english/utils/loading.dart'; +import 'package:wow_english/utils/toast_util.dart'; part 'lesson_event.dart'; part 'lesson_state.dart'; class LessonBloc extends Bloc { - final int pageIndex; final PageController pageController; @@ -23,14 +22,13 @@ class LessonBloc extends Bloc { List get listData => _listData; - LessonBloc(this.pageIndex,this.pageController) : super(LessonInitial()) { + LessonBloc(this.pageIndex, this.pageController) : super(LessonInitial()) { _currentPageIndex = pageIndex; on(_pageIndexChange); on(_requestData); } - - void _pageIndexChange(PageViewChangeIndexEvent event,Emitter emitter) async { + void _pageIndexChange(PageViewChangeIndexEvent event, Emitter emitter) async { _currentPageIndex = event.index; emitter(PageIndexChangeState()); } @@ -38,12 +36,12 @@ class LessonBloc extends Bloc { void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { - _listData = await HomeDao.courseModule()??[]; + _listData = await HomeDao.courseModule() ?? []; emitter(LessonDataLoadState()); }); } catch (e) { if (e is ApiException) { - EasyLoading.showToast(e.message??'请求失败,请检查网络连接'); + showToast(e.message ?? '请求失败,请检查网络连接'); } } } diff --git a/lib/pages/lessons/lesson_page.dart b/lib/pages/lessons/lesson_page.dart index c7dc3a7..b31bad6 100644 --- a/lib/pages/lessons/lesson_page.dart +++ b/lib/pages/lessons/lesson_page.dart @@ -56,7 +56,7 @@ class _LessonPageView extends StatelessWidget { // icon: Image.asset('shop'.assetPng), // color: Colors.white, // onPressed: () { - // EasyLoading.showToast('购买'); + // showToast('购买'); // }, // ) // ], @@ -177,4 +177,4 @@ class _LessonPageView extends StatelessWidget { ), ); }); -} \ No newline at end of file +} diff --git a/lib/pages/listen/bloc/listen_bloc.dart b/lib/pages/listen/bloc/listen_bloc.dart index 57a651d..8621add 100644 --- a/lib/pages/listen/bloc/listen_bloc.dart +++ b/lib/pages/listen/bloc/listen_bloc.dart @@ -1,37 +1,33 @@ -import 'dart:convert'; - 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/listen_dao.dart'; import 'package:wow_english/common/request/exception.dart'; import 'package:wow_english/models/listen_entity.dart'; import 'package:wow_english/utils/loading.dart'; +import 'package:wow_english/utils/toast_util.dart'; part 'listen_event.dart'; part 'listen_state.dart'; class ListenBloc extends Bloc { - List _listData = []; + List get listData => _listData; ListenBloc() : super(ListenInitial()) { on(_requestData); } - - void _requestData(RequestDataEvent event,Emitter emitter) async { + void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { - _listData = await ListenDao.listen()??[]; + _listData = await ListenDao.listen() ?? []; emitter(RequestListenDataState()); }); } catch (e) { if (e is ApiException) { - EasyLoading.showToast(e.message??'请求失败,请检查网络连接'); + showToast(e.message ?? '请求失败,请检查网络连接'); } } } - } diff --git a/lib/pages/login/forgetpwd/bloc/forget_pwd_home_bloc.dart b/lib/pages/login/forgetpwd/bloc/forget_pwd_home_bloc.dart index 74999e1..e3c4a8a 100644 --- a/lib/pages/login/forgetpwd/bloc/forget_pwd_home_bloc.dart +++ b/lib/pages/login/forgetpwd/bloc/forget_pwd_home_bloc.dart @@ -1,18 +1,18 @@ +import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:common_utils/common_utils.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:wow_english/utils/toast_util.dart'; part 'forget_pwd_home_event.dart'; part 'forget_pwd_home_state.dart'; class ForgetPwdHomeBloc extends Bloc { - ///是否可以发送验证码 bool _canSendSms = false; bool _canSetPwd = false; bool get canSendSms => _canSendSms; + bool get canSetPwd => _canSetPwd; final TextEditingController phoneNumController = TextEditingController(); @@ -57,15 +57,13 @@ class ForgetPwdHomeBloc extends Bloc { } } - void _setPassWord(SetPassWordEvent event,Emitter emitter) async { - if(!RegexUtil.isMobileExact(phoneNumController.text)) { - EasyLoading.showToast('手机号不正确!'); + void _setPassWord(SetPassWordEvent event, Emitter emitter) async { + if (!RegexUtil.isMobileExact(phoneNumController.text)) { + showToast('手机号不正确!'); return; } emitter(SetPwdCheckCodeState()); } - void _sendSmsCode(SendSmsCodeEvent event,Emitter emitter) async { - - } + void _sendSmsCode(SendSmsCodeEvent event, Emitter emitter) async {} } diff --git a/lib/pages/login/forgetpwd/forget_password_home_page.dart b/lib/pages/login/forgetpwd/forget_password_home_page.dart index fd98e2e..a3d80ef 100644 --- a/lib/pages/login/forgetpwd/forget_password_home_page.dart +++ b/lib/pages/login/forgetpwd/forget_password_home_page.dart @@ -4,7 +4,8 @@ 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/login/loginpage/time_widget.dart'; -import 'package:wow_english/route/route.dart'; +import 'package:wow_english/pages/login/setpwd/set_pwd_page.dart'; +import 'package:wow_english/utils/toast_util.dart'; import 'bloc/forget_pwd_home_bloc.dart'; @@ -26,15 +27,26 @@ class _ForgetPasswordHomePageView extends StatelessWidget { return BlocListener( listener: (context, state) { if (state is SetPwdCheckCodeState) { - Navigator.of(context).pushNamed(AppRouteName.setPwd,arguments: {'phoneNumber':context.read().phoneNumController.text}); + var bloc = context.read(); + var phoneNum = bloc.phoneNumController.text; + var smsCode = bloc.checkNumController.text; + if (phoneNum.isEmpty) { + '请输入手机号'.toast(); + return; + } + if (smsCode.isEmpty) { + '请输入验证码'.toast(); + return; + } + // todo 后续需要改成在当前页面,验证过验证码后,再跳转到设置密码页面 + SetPassWordPage.push(context, SetPwdPageType.changePwd, phoneNum: phoneNum, smsCode: smsCode); } }, child: _buildForgetPwdView(), ); } - Widget _buildForgetPwdView() => BlocBuilder( - builder: (context, state) { + Widget _buildForgetPwdView() => BlocBuilder(builder: (context, state) { final bloc = BlocProvider.of(context); return Scaffold( body: Container( @@ -42,7 +54,7 @@ class _ForgetPasswordHomePageView extends StatelessWidget { child: SafeArea( child: SingleChildScrollView( child: Padding( - padding: EdgeInsets.only(left: 49.w,right: 10.w), + padding: EdgeInsets.only(left: 49.w, right: 10.w), child: Column( children: [ 34.verticalSpace, @@ -56,10 +68,7 @@ class _ForgetPasswordHomePageView extends StatelessWidget { 12.5.horizontalSpace, Text( '修改密码\n请输入您的手机号和验证码吧', - style: TextStyle( - fontSize: 16.sp, - color: const Color(0xFF666666) - ), + style: TextStyle(fontSize: 16.sp, color: const Color(0xFF666666)), ) ], ), @@ -68,62 +77,59 @@ class _ForgetPasswordHomePageView extends StatelessWidget { children: [ Expanded( child: Column( + children: [ + 44.5.verticalSpace, + Row( children: [ - 44.5.verticalSpace, - Row( - children: [ - Image.asset( - 'phone'.assetPng, - height: 45.h, - width: 35.w, - ), - 15.horizontalSpace, - Expanded( - child: TextFieldCustomerWidget( - height: 50.h, - hitText: '请输入当前手机号', - textInputType: TextInputType.phone, - bgImageName: 'Input_layer_up', - onChangeValue: (String value) { - bloc.add(PhoneNumChangeEvent()); - }, - controller: bloc.phoneNumController, - ) - ) - ], + Image.asset( + 'phone'.assetPng, + height: 45.h, + width: 35.w, ), - 11.5.verticalSpace, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'lock'.assetPng, - height: 34.h, - width: 31.w, - ), - 18.5.horizontalSpace, - Expanded( - child: TextFieldCustomerWidget( - hitText: '请输入验证码', - bgImageName: 'Input_layer_down', - onChangeValue: (String value) { - bloc.add(CheckCodeChangeEvent()); - }, - textInputType: TextInputType.emailAddress, - controller: bloc.checkNumController, - ) - ), - 16.5.horizontalSpace, - TimerWidget( - pageType: 1, - canSendSms: bloc.canSendSms, - sendSmsEvent: () => bloc.add(SendSmsCodeEvent()), - ) - ], + 15.horizontalSpace, + Expanded( + child: TextFieldCustomerWidget( + height: 50.h, + hitText: '请输入当前手机号', + textInputType: TextInputType.phone, + bgImageName: 'Input_layer_up', + onChangeValue: (String value) { + bloc.add(PhoneNumChangeEvent()); + }, + controller: bloc.phoneNumController, + )) + ], + ), + 11.5.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + 'lock'.assetPng, + height: 34.h, + width: 31.w, + ), + 18.5.horizontalSpace, + Expanded( + child: TextFieldCustomerWidget( + hitText: '请输入验证码', + bgImageName: 'Input_layer_down', + onChangeValue: (String value) { + bloc.add(CheckCodeChangeEvent()); + }, + textInputType: TextInputType.emailAddress, + controller: bloc.checkNumController, + )), + 16.5.horizontalSpace, + TimerWidget( + pageType: 1, + canSendSms: bloc.canSendSms, + sendSmsEvent: () => bloc.add(SendSmsCodeEvent()), ) ], ) - ), + ], + )), 2.verticalSpace, Image.asset( 'steven_bride'.assetPng, @@ -141,22 +147,13 @@ class _ForgetPasswordHomePageView extends StatelessWidget { child: Container( decoration: BoxDecoration( image: DecorationImage( - image: AssetImage( - bloc.canSetPwd?'login_enter'.assetPng:'login_enter_dis'.assetPng - ), - fit: BoxFit.fill - ), - ), - padding: EdgeInsets.symmetric( - horizontal: 28.w, - vertical: 14.h + image: AssetImage(bloc.canSetPwd ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), + fit: BoxFit.fill), ), + padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), child: Text( '确定', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white - ), + style: TextStyle(fontSize: 16.sp, color: Colors.white), ), ), ) @@ -167,6 +164,5 @@ class _ForgetPasswordHomePageView extends StatelessWidget { ), ), ); - } - ); -} \ No newline at end of file + }); +} diff --git a/lib/pages/login/loginpage/bloc/login_bloc.dart b/lib/pages/login/loginpage/bloc/login_bloc.dart index 8ce7cdc..119fb0a 100644 --- a/lib/pages/login/loginpage/bloc/login_bloc.dart +++ b/lib/pages/login/loginpage/bloc/login_bloc.dart @@ -2,12 +2,12 @@ import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/request/dao/user_dao.dart'; import 'package:wow_english/common/request/exception.dart'; import 'package:wow_english/models/user_entity.dart'; import 'package:wow_english/utils/loading.dart'; +import 'package:wow_english/utils/toast_util.dart'; part 'login_event.dart'; part 'login_state.dart'; @@ -59,20 +59,19 @@ class LoginBloc extends Bloc { void _requestLoginApi(RequestLoginEvent event, Emitter emitter) async { var phoneNumber = phoneNumController.text; if (phoneNumber.isEmpty) { - EasyLoading.showToast('号码不能为空'); + showToast('号码不能为空'); return; } var checkNumber = checkNumController.text; if (checkNumber.isEmpty) { var text = _isSmsLoginType ? '密码' : '验证码'; - EasyLoading.showToast('$text不能为空'); + showToast('$text不能为空'); return; } var checkKey = _isSmsLoginType ? 'smsCode' : 'password'; var type = _isSmsLoginType ? 'sms_code' : 'pwd'; - try { await loading(() async { var user = await UserDao.login(phoneNumber, type, checkKey, checkNumber); @@ -85,7 +84,7 @@ class LoginBloc extends Bloc { if (kDebugMode) { print(e); } - EasyLoading.showToast('登陆失败${(e as ApiException?)?.message?.prefixColon}'); + showToast('登陆失败${(e as ApiException?)?.message?.prefixColon}'); } } @@ -93,7 +92,7 @@ class LoginBloc extends Bloc { void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter emitter) async { final phoneNumber = phoneNumController.text; if (!RegexUtil.isMobileExact(phoneNumber)) { - EasyLoading.showToast('请检查手机号'); + showToast('请检查手机号'); return; } try { @@ -105,7 +104,7 @@ class LoginBloc extends Bloc { if (kDebugMode) { print(e); } - EasyLoading.showToast('获取验证码失败${(e as ApiException?)?.message?.prefixColon}'); + showToast('获取验证码失败${(e as ApiException?)?.message?.prefixColon}'); } } diff --git a/lib/pages/login/loginpage/login_page.dart b/lib/pages/login/loginpage/login_page.dart index bb05564..2c5d0e1 100644 --- a/lib/pages/login/loginpage/login_page.dart +++ b/lib/pages/login/loginpage/login_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/blocs/cachebloc/cache_bloc.dart'; +import 'package:wow_english/common/core/app_consts.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/login/loginpage/time_widget.dart'; @@ -104,7 +105,7 @@ class _LoginPageView extends StatelessWidget { recognizer: TapGestureRecognizer() ..onTap = () { Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { - 'urlStr': 'http://page.kouyuxingqiu.com/%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%E5%8F%8A%E4%BD%BF%E7%94%A8APP%E9%9A%90%E7%A7%81%E5%8D%8F%E8%AE%AE.html', + 'urlStr': AppConsts.userPrivacyPolicyUrl, 'webViewTitle': '用户隐私协议' }); }), diff --git a/lib/pages/login/setpwd/bloc/set_pwd_bloc.dart b/lib/pages/login/setpwd/bloc/set_pwd_bloc.dart index 4049f94..cf37538 100644 --- a/lib/pages/login/setpwd/bloc/set_pwd_bloc.dart +++ b/lib/pages/login/setpwd/bloc/set_pwd_bloc.dart @@ -1,14 +1,16 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import '../set_pwd_page.dart'; + part 'set_pwd_event.dart'; part 'set_pwd_state.dart'; class SetPwdBloc extends Bloc { final String? phoneNumber; - final String? code; - final int? type; + final String? smsCode; + late final SetPwdPageType pageType; final TextEditingController passWordFirstController = TextEditingController(); final TextEditingController passWordSecondController = TextEditingController(); @@ -35,7 +37,7 @@ class SetPwdBloc extends Bloc { bool get ensure => _passwordCheck && _passwordEnsure; - SetPwdBloc(this.phoneNumber, this.code, this.type) : super(SetPwdInitial()) { + SetPwdBloc(this.phoneNumber, this.smsCode, this.pageType) : super(SetPwdInitial()) { on(_pwdEnsureTextChange); on(_pwdCheckTextChange); on(_setPassword); diff --git a/lib/pages/login/setpwd/set_pwd_page.dart b/lib/pages/login/setpwd/set_pwd_page.dart index debde6a..bf02fef 100644 --- a/lib/pages/login/setpwd/set_pwd_page.dart +++ b/lib/pages/login/setpwd/set_pwd_page.dart @@ -7,27 +7,49 @@ import 'package:wow_english/route/route.dart'; import 'bloc/set_pwd_bloc.dart'; +enum SetPwdPageType { + /// 第一次设置密码 + setPwd, + + /// 忘记重设密码,必传手机号和验证码 + resetPwd, + + /// 修改密码 + changePwd, +} class SetPassWordPage extends StatelessWidget { - const SetPassWordPage({super.key,this.phoneNum,this.code,this.type}); + const SetPassWordPage({super.key, this.phoneNum, this.smsCode, required this.pageType}); + + final SetPwdPageType pageType; final String? phoneNum; - final String? code; - final int? type; + final String? smsCode; @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => SetPwdBloc(phoneNum,code,type), + create: (context) => SetPwdBloc(phoneNum, smsCode, pageType), child: _SetPassWordPageView(), ); } + + static push(BuildContext context, SetPwdPageType pageType, {String? phoneNum, String? smsCode}) { + Navigator.of(context).pushNamed(AppRouteName.setPwd, arguments: { + 'pageType': pageType, + 'phoneNum': phoneNum, + 'smsCode': smsCode, + }); + } } class _SetPassWordPageView extends StatelessWidget { + late final SetPwdBloc bloc; + @override Widget build(BuildContext context) { + bloc = BlocProvider.of(context); return BlocListener( - listener: (context, s){ + listener: (context, s) { if (s is PasswordSetSuccessState) { Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); } @@ -36,9 +58,22 @@ class _SetPassWordPageView extends StatelessWidget { ); } - Widget _buildSetPwdView() => BlocBuilder( - builder: (context, state) { - final bloc = BlocProvider.of(context); + String _getTipsText() { + String text = ''; + + switch (bloc.pageType) { + case SetPwdPageType.setPwd: + text = '欢迎登录wow english\n接下来请设置一下您的密码吧!'; + break; + case SetPwdPageType.resetPwd: + case SetPwdPageType.changePwd: + text = '修改密码\n接下来请设置一下您的新密码吧!'; + break; + } + return text; + } + + Widget _buildSetPwdView() => BlocBuilder(builder: (context, state) { return Scaffold( body: Container( color: Colors.white, @@ -59,11 +94,8 @@ class _SetPassWordPageView extends StatelessWidget { ), 12.5.horizontalSpace, Text( - '欢迎登录wow english\n接下来请设置一下您的密码吧!', - style: TextStyle( - fontSize: 16.5.sp, - color: const Color(0xFF666666) - ), + _getTipsText(), + style: TextStyle(fontSize: 16.5.sp, color: const Color(0xFF666666)), ) ], ), @@ -79,20 +111,19 @@ class _SetPassWordPageView extends StatelessWidget { children: [ Expanded( child: TextFieldCustomerWidget( - height: 55.h, - hitText: '请输入八位以上密码', - bgImageName: 'Input_layer_up', - controller: bloc.passWordFirstController, - obscureText: true, - textInputType: TextInputType.emailAddress, - onChangeValue: (String value) => bloc.add(PwdEnsureEvent()), - ) - ), + height: 55.h, + hitText: '请输入八位以上密码', + bgImageName: 'Input_layer_up', + controller: bloc.passWordFirstController, + obscureText: true, + textInputType: TextInputType.emailAddress, + onChangeValue: (String value) => bloc.add(PwdEnsureEvent()), + )), 10.horizontalSpace, Opacity( - opacity: bloc.showPwdIcon?1:0, + opacity: bloc.showPwdIcon ? 1 : 0, child: Image.asset( - bloc.passwordEnsure?'login_pass'.assetPng:'login_error'.assetPng, + bloc.passwordEnsure ? 'login_pass'.assetPng : 'login_error'.assetPng, height: 30, width: 30, ), @@ -109,20 +140,19 @@ class _SetPassWordPageView extends StatelessWidget { children: [ Expanded( child: TextFieldCustomerWidget( - height: 55.h, - hitText: '请再次输入相同密码', - bgImageName: 'Input_layer_up', - obscureText: true, - textInputType: TextInputType.emailAddress, - controller: bloc.passWordSecondController, - onChangeValue: (String value) => bloc.add(PwdCheckEvent()), - ) - ), + height: 55.h, + hitText: '请再次输入相同密码', + bgImageName: 'Input_layer_up', + obscureText: true, + textInputType: TextInputType.emailAddress, + controller: bloc.passWordSecondController, + onChangeValue: (String value) => bloc.add(PwdCheckEvent()), + )), 10.horizontalSpace, Opacity( - opacity: bloc.showCheckPwdIcon?1:0, + opacity: bloc.showCheckPwdIcon ? 1 : 0, child: Image.asset( - bloc.passwordCheck?'login_pass'.assetPng:'login_error'.assetPng, + bloc.passwordCheck ? 'login_pass'.assetPng : 'login_error'.assetPng, height: 30, width: 30, ), @@ -134,10 +164,7 @@ class _SetPassWordPageView extends StatelessWidget { offstage: bloc.passwordCheck, child: Text( '请确认两次输入的密码是否一致', - style: TextStyle( - fontSize: 16.sp, - color: const Color(0xFF333333) - ), + style: TextStyle(fontSize: 16.sp, color: const Color(0xFF333333)), ), ), Row( @@ -154,21 +181,13 @@ class _SetPassWordPageView extends StatelessWidget { decoration: BoxDecoration( image: DecorationImage( image: AssetImage( - bloc.ensure?'login_enter'.assetPng:'login_enter_dis'.assetPng - ), - fit: BoxFit.fill - ), - ), - padding: EdgeInsets.symmetric( - horizontal: 28.w, - vertical: 14.h + bloc.ensure ? 'login_enter'.assetPng : 'login_enter_dis'.assetPng), + fit: BoxFit.fill), ), + padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 14.h), child: Text( '确定', - style: TextStyle( - color: Colors.white, - fontSize: 16.sp - ), + style: TextStyle(color: Colors.white, fontSize: 16.sp), ), ), ), @@ -194,6 +213,5 @@ class _SetPassWordPageView extends StatelessWidget { ), ), ); - } - ); -} \ 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 c126e1e..28b3647 100644 --- a/lib/pages/repeatafter/bloc/repeat_after_bloc.dart +++ b/lib/pages/repeatafter/bloc/repeat_after_bloc.dart @@ -1,33 +1,32 @@ 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/listen_dao.dart'; import 'package:wow_english/common/request/exception.dart'; import 'package:wow_english/models/follow_read_entity.dart'; import 'package:wow_english/utils/loading.dart'; +import 'package:wow_english/utils/toast_util.dart'; part 'repeat_after_event.dart'; part 'repeat_after_state.dart'; class RepeatAfterBloc extends Bloc { - List _listData = []; + List get listData => _listData; RepeatAfterBloc() : super(RepeatAfterInitial()) { on(_requestData); } - void _requestData(RequestDataEvent event, Emitter emitter) async { try { await loading(() async { - _listData = await ListenDao.followRead()??[]; + _listData = await ListenDao.followRead() ?? []; emitter(RequestDataState()); }); } catch (e) { if (e is ApiException) { - EasyLoading.showToast(e.message??'请求失败,请检查网络连接'); + showToast(e.message ?? '请求失败,请检查网络连接'); } } } diff --git a/lib/pages/repeatafter/repeat_after_page.dart b/lib/pages/repeatafter/repeat_after_page.dart index f4d9e87..fdd07cb 100644 --- a/lib/pages/repeatafter/repeat_after_page.dart +++ b/lib/pages/repeatafter/repeat_after_page.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_easyloading/flutter_easyloading.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 'bloc/repeat_after_bloc.dart'; @@ -25,7 +25,7 @@ class _RepeatAfterPageView extends StatelessWidget { return BlocListener( listener: (context, state) { if (state is RequestDataState) { - EasyLoading.showToast('网络请求结束'); + showToast('网络请求结束'); } }, child: _repeatAfterView(), @@ -33,32 +33,29 @@ class _RepeatAfterPageView extends StatelessWidget { } Widget _repeatAfterView() => BlocBuilder( - builder: (context, state) { - final bloc = BlocProvider.of(context); - return Scaffold( - appBar: const WEAppBar( - titleText: '视频跟读', - centerTitle: false, - ), - body: SafeArea( - child: Container( - alignment: Alignment.center, - child: ListView.builder( - itemCount: bloc.listData.length, - scrollDirection: Axis.horizontal, - itemBuilder: (BuildContext context,int index){ - FollowReadEntity? entity = bloc.listData[index]; - return RepeatAfterItem( - tapEvent: () { - - }, - entity: entity, - ); - }), - ), - ), + builder: (context, state) { + final bloc = BlocProvider.of(context); + return Scaffold( + appBar: const WEAppBar( + titleText: '视频跟读', + centerTitle: false, + ), + body: SafeArea( + child: Container( + alignment: Alignment.center, + child: ListView.builder( + itemCount: bloc.listData.length, + scrollDirection: Axis.horizontal, + itemBuilder: (BuildContext context, int index) { + FollowReadEntity? entity = bloc.listData[index]; + return RepeatAfterItem( + tapEvent: () {}, + entity: entity, + ); + }), + ), + ), + ); + }, ); - }, - ); } - diff --git a/lib/pages/shop/exchane/exchange_lesson_page.dart b/lib/pages/shop/exchane/exchange_lesson_page.dart index e026b83..3b90cbf 100644 --- a/lib/pages/shop/exchane/exchange_lesson_page.dart +++ b/lib/pages/shop/exchane/exchange_lesson_page.dart @@ -1,10 +1,10 @@ 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/textfield_customer_widget.dart'; import 'package:wow_english/route/route.dart'; +import 'package:wow_english/utils/toast_util.dart'; import 'bloc/exchange_lesson_bloc.dart'; @@ -23,11 +23,11 @@ class ExchangeLessonPage extends StatelessWidget { class _ExchangeLessonPage extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( - listener: (context, state){ + return BlocListener( + listener: (context, state) { if (state is CheckCodeResultState) { - String title = state.result?'兑换成功':'兑换失败'; - EasyLoading.showToast(title); + String title = state.result ? '兑换成功' : '兑换失败'; + showToast(title); Navigator.of(context).pushNamed(AppRouteName.exList); } }, @@ -35,8 +35,7 @@ class _ExchangeLessonPage extends StatelessWidget { ); } - Widget _exchangeLessonPageView() => BlocBuilder( - builder: (context, state){ + Widget _exchangeLessonPageView() => BlocBuilder(builder: (context, state) { final bloc = BlocProvider.of(context); return Scaffold( resizeToAvoidBottomInset: false, @@ -47,9 +46,7 @@ class _ExchangeLessonPage extends StatelessWidget { children: [ 10.5.verticalSpace, Padding( - padding: EdgeInsets.symmetric( - horizontal: 15.w - ), + padding: EdgeInsets.symmetric(horizontal: 15.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, @@ -62,7 +59,7 @@ class _ExchangeLessonPage extends StatelessWidget { ), color: Colors.white, onPressed: () { - Navigator.pop(context); + Navigator.pop(context); }, ), Image.asset( @@ -70,9 +67,7 @@ class _ExchangeLessonPage extends StatelessWidget { width: 139.w, height: 81.h, ), - SizedBox.fromSize( - size: const Size(40.0, 40.0) - ) + SizedBox.fromSize(size: const Size(40.0, 40.0)) ], ), ), @@ -102,19 +97,13 @@ class _ExchangeLessonPage extends StatelessWidget { child: Container( decoration: BoxDecoration( image: DecorationImage( - image: AssetImage( - bloc.checkCode ? 'ex_sure'.assetPng:'ex_dis'.assetPng - ), - fit: BoxFit.fill - ), + image: AssetImage(bloc.checkCode ? 'ex_sure'.assetPng : 'ex_dis'.assetPng), + fit: BoxFit.fill), ), - padding: EdgeInsets.symmetric(horizontal:27.w,vertical: 14.h), + padding: EdgeInsets.symmetric(horizontal: 27.w, vertical: 14.h), child: Text( '兑换', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white - ), + style: TextStyle(fontSize: 16.sp, color: Colors.white), ), ), ) @@ -130,4 +119,4 @@ class _ExchangeLessonPage extends StatelessWidget { ), ); }); -} \ No newline at end of file +} diff --git a/lib/pages/shop/home/shop_home_page.dart b/lib/pages/shop/home/shop_home_page.dart index fb1d46e..907dc43 100644 --- a/lib/pages/shop/home/shop_home_page.dart +++ b/lib/pages/shop/home/shop_home_page.dart @@ -1,11 +1,11 @@ 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'; import 'package:wow_english/pages/shop/home/widgets/lesson_card_item.dart'; import 'package:wow_english/route/route.dart'; +import 'package:wow_english/utils/toast_util.dart'; import 'bloc/shop_home_bloc.dart'; @@ -24,59 +24,58 @@ class ShopHomePage extends StatelessWidget { class _ShopHomeView extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( + return BlocListener( listener: (context, state) {}, child: _shopHomeWidget(), ); } - Widget _shopHomeWidget() => BlocBuilder(builder: (context, state){ - return Scaffold( - appBar: WEAppBar( - actions: [ - IconButton( - icon: Image.asset( - 'check_lesson'.assetPng, - width: 40, - height: 40, - ), - color: Colors.white, - onPressed: () { - Navigator.of(context).pushNamed(AppRouteName.exLesson); - }, + Widget _shopHomeWidget() => BlocBuilder(builder: (context, state) { + return Scaffold( + appBar: WEAppBar( + actions: [ + IconButton( + icon: Image.asset( + 'check_lesson'.assetPng, + width: 40, + height: 40, + ), + color: Colors.white, + onPressed: () { + Navigator.of(context).pushNamed(AppRouteName.exLesson); + }, + ), + IconButton( + icon: Image.asset( + 'shop'.assetPng, + width: 40, + height: 40, + ), + color: Colors.white, + onPressed: () { + showToast('购前须知'); + }, + ) + ], ), - IconButton( - icon: Image.asset( - 'shop'.assetPng, - width: 40, - height: 40, + body: Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 25.h, horizontal: 25.w), + child: GridView.builder( + itemCount: 4, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 2, + mainAxisSpacing: 14.h, + crossAxisSpacing: 4.5.w, + ), + itemBuilder: (BuildContext context, int index) { + return LessonCardItem(onTap: () { + showToast('购买'); + }); + }), ), - color: Colors.white, - onPressed: () { - EasyLoading.showToast('购前须知'); - }, - ) - ], - ), - body: Center( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 25.h,horizontal: 25.w), - child: GridView.builder( - itemCount: 4, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - childAspectRatio: 2, - mainAxisSpacing: 14.h, - crossAxisSpacing : 4.5.w, - ), - itemBuilder: (BuildContext context,int index){ - return LessonCardItem( - onTap: (){ - EasyLoading.showToast('购买'); - }); - }), - ), - ), - ); - }); -} \ No newline at end of file + ), + ); + }); +} diff --git a/lib/pages/user/bloc/user_bloc.dart b/lib/pages/user/bloc/user_bloc.dart index 2db7551..5050068 100644 --- a/lib/pages/user/bloc/user_bloc.dart +++ b/lib/pages/user/bloc/user_bloc.dart @@ -1,5 +1,4 @@ -import 'package:bloc/bloc.dart'; -import 'package:meta/meta.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wow_english/common/request/dao/user_dao.dart'; part 'user_event.dart'; @@ -7,13 +6,10 @@ part 'user_state.dart'; class UserBloc extends Bloc { UserBloc() : super(UserInitial()) { - on(_test); - on((event, emit) { - // TODO: implement event handler - }); + on(_logout); } - void _test(UserLogout event, Emitter emitter) async { + void _logout(UserLogout event, Emitter emitter) async { print('UserBloc._test, event: $event, emitter: $emitter'); await UserDao.logout(); } diff --git a/lib/pages/user/bloc/user_event.dart b/lib/pages/user/bloc/user_event.dart index 60941d5..4f84932 100644 --- a/lib/pages/user/bloc/user_event.dart +++ b/lib/pages/user/bloc/user_event.dart @@ -1,7 +1,6 @@ part of 'user_bloc.dart'; -@immutable -abstract class UserEvent {} +sealed class UserEvent {} class UserStarted extends UserEvent {} diff --git a/lib/pages/user/bloc/user_state.dart b/lib/pages/user/bloc/user_state.dart index a2a6220..6b74425 100644 --- a/lib/pages/user/bloc/user_state.dart +++ b/lib/pages/user/bloc/user_state.dart @@ -1,6 +1,7 @@ part of 'user_bloc.dart'; -@immutable -abstract class UserState {} +sealed class UserState {} class UserInitial extends UserState {} + +class UserInfoUpdated extends UserState {} diff --git a/lib/pages/user/user_page.dart b/lib/pages/user/user_page.dart index b28454a..c593735 100644 --- a/lib/pages/user/user_page.dart +++ b/lib/pages/user/user_page.dart @@ -2,12 +2,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:wow_english/common/blocs/cachebloc/cache_bloc.dart'; +import 'package:wow_english/common/core/app_consts.dart'; import 'package:wow_english/common/core/assets_const.dart'; -import 'package:wow_english/common/widgets/ow_image_widget.dart'; import 'package:wow_english/common/widgets/we_app_bar.dart'; import 'package:wow_english/models/user_entity.dart'; +import 'package:wow_english/pages/login/setpwd/set_pwd_page.dart'; import 'package:wow_english/pages/user/bloc/user_bloc.dart'; import 'package:wow_english/route/route.dart'; +import 'package:wow_english/utils/image_util.dart'; class UserPage extends StatelessWidget { const UserPage({super.key}); @@ -26,152 +28,162 @@ class _UserView extends StatelessWidget { @override Widget build(BuildContext context) { - final cacheBloc = BlocProvider.of(context); - final userBloc = BlocProvider.of(context); - UserEntity user = cacheBloc.userEntity!; + return _pageWidget(); + } - // 常规按钮的字体样式 - final textStyle21sp = TextStyle( - //fontWeight: FontWeight.w600, - color: const Color(0xFF333333), - fontSize: 21.sp, - ); + Widget _pageWidget() => BlocBuilder( + /*buildWhen: (previous, current) { + return current != previous; + },*/ + builder: (context, state) { + final cacheBloc = BlocProvider.of(context); + UserEntity user = cacheBloc.userEntity!; + final userBloc = BlocProvider.of(context); - // 常规按钮的样式 - var normalButtonStyle = ButtonStyle( - side: MaterialStateProperty.all(BorderSide(color: const Color(0xFF140C10), width: 1.5)), - shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.r))), - minimumSize: MaterialStateProperty.all(Size(double.infinity, 58.h)), - backgroundColor: MaterialStateProperty.all(Colors.white), - ); - return Scaffold( - backgroundColor: Colors.white, - appBar: const WEAppBar(), - body: SingleChildScrollView( - //padding: EdgeInsets.symmetric(horizontal: 17.w), - padding: EdgeInsets.only(left: 17.w, right: 17.w, top: 10.h, bottom: 22.h), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container(child: Image.asset(AssetsConst.wowLogo), constraints: BoxConstraints(maxHeight: 196.h)), - 30.verticalSpace, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - CircleAvatar( - radius: 40.r, - backgroundColor: Color(0xFF140C10), - /*child: CircleAvatar( - radius: 38.5.r, - backgroundImage: ImageUtil.getImageProviderOnDefault(user.avatarUrl), - ),*/ - child: ClipOval( - child: OwImageWidget(name: user.avatarUrl ?? AssetsConst.wowLogo), - )), - 32.horizontalSpace, - Expanded( - child: Column( - children: [ - Row( - children: [ - LimitedBox( - maxWidth: 220.w, - child: Text( - user.name, - //'1231231231312312312312312312312312312312312312312', - style: textStyle21sp, - overflow: TextOverflow.ellipsis, - ), - ), - 14.horizontalSpace, - Text( - user.getGenderString(), - style: textStyle21sp, - ), - 14.horizontalSpace, - Offstage( - offstage: user.effectiveDate == null, - child: Image.asset( - AssetsConst.icVip, - height: 18.h, - ), - ) - ], + // 常规按钮的字体样式 + final textStyle21sp = TextStyle( + //fontWeight: FontWeight.w600, + color: const Color(0xFF333333), + fontSize: 21.sp, + ); + + // 常规按钮的样式 + var normalButtonStyle = ButtonStyle( + side: MaterialStateProperty.all(BorderSide(color: const Color(0xFF140C10), width: 1.5.w)), + shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.r))), + minimumSize: MaterialStateProperty.all(Size(double.infinity, 58.h)), + backgroundColor: MaterialStateProperty.all(Colors.white), + ); + + return Scaffold( + backgroundColor: Colors.white, + appBar: const WEAppBar(), + body: SingleChildScrollView( + padding: EdgeInsets.only(left: 17.w, right: 17.w, top: 10.h, bottom: 22.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // banner + Container(child: Image.asset(AssetsConst.wowLogo), constraints: BoxConstraints(maxHeight: 196.h)), + 30.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CircleAvatar( + radius: 40.r, + backgroundColor: Color(0xFF140C10), + child: CircleAvatar( + radius: 38.5.r, + backgroundImage: ImageUtil.getImageProviderOnDefault(user.avatarUrl), ), - Offstage( - offstage: user.effectiveDate == null, - child: Row( + /*child: ClipOval( + child: OwImageWidget(name: user.avatarUrl ?? AssetsConst.wowLogo, fit: BoxFit.contain,), + )*/ + ), + 32.horizontalSpace, + Expanded( + child: Column( + children: [ + Row( children: [ + LimitedBox( + maxWidth: 220.w, + child: Text( + user.name, + //'1231231231312312312312312312312312312312312312312', + style: textStyle21sp, + overflow: TextOverflow.ellipsis, + ), + ), + 14.horizontalSpace, Text( - "${user.effectiveDate} 到期", - style: TextStyle( - color: const Color(0xFFE11212), - fontSize: 17.sp, + user.getGenderString(), + style: textStyle21sp, + ), + 14.horizontalSpace, + Offstage( + offstage: user.effectiveDate == null, + child: Image.asset( + AssetsConst.icVip, + height: 18.h, ), ) ], ), - ) - ], - )), - TextButton( - child: Text( - "修改个人信息>", - style: textStyle21sp, + Offstage( + offstage: user.effectiveDate == null, + child: Row( + children: [ + Text( + "${user.effectiveDate} 到期", + style: TextStyle( + color: const Color(0xFFE11212), + fontSize: 17.sp, + ), + ) + ], + ), + ) + ], + )), + TextButton( + child: Text( + "修改个人信息>", + style: textStyle21sp, + ), + onPressed: () {}, + ) + ], ), - onPressed: () {}, - ) - ], - ), - 30.verticalSpace, - OutlinedButton( - onPressed: () => {}, - style: normalButtonStyle, - child: Text( - "修改密码", - style: textStyle21sp, - ), - ), - 12.verticalSpace, - OutlinedButton( - onPressed: () => {}, - style: normalButtonStyle, - child: Text( - "兑换课程", - style: textStyle21sp, - )), - 12.verticalSpace, - OutlinedButton( - onPressed: () => { - Navigator.of(context).pushNamed(AppRouteName.webView, arguments: { - 'urlStr': 'http://page.kouyuxingqiu.com/%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%E5%8F%8A%E4%BD%BF%E7%94%A8APP%E9%9A%90%E7%A7%81%E5%8D%8F%E8%AE%AE.html', - 'webViewTitle': '隐私协议' - }) - }, - style: normalButtonStyle, - child: Text( - "隐私协议", - style: textStyle21sp, - )), - 30.verticalSpace, - OutlinedButton( - onPressed: () => {userBloc.add(UserLogout())}, - style: ButtonStyle( - side: MaterialStateProperty.all(BorderSide(color: const Color(0xFF140C10), width: 1.5)), - shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.r))), - minimumSize: MaterialStateProperty.all(Size(295.w, 40.h)), - backgroundColor: MaterialStateProperty.all(Color(0xFFFBB621)), - ), - child: Text( - "退出登陆", - style: TextStyle( - //fontWeight: FontWeight.w600, - color: Colors.white, - fontSize: 17.sp, + 30.verticalSpace, + OutlinedButton( + onPressed: () => SetPassWordPage.push(context, SetPwdPageType.changePwd), + style: normalButtonStyle, + child: Text( + "修改密码", + style: textStyle21sp, + ), ), - )), - ], - ), - )); - } + 12.verticalSpace, + OutlinedButton( + onPressed: () => {}, + style: normalButtonStyle, + child: Text( + "兑换课程", + style: textStyle21sp, + )), + 12.verticalSpace, + OutlinedButton( + onPressed: () => { + Navigator.of(context).pushNamed(AppRouteName.webView, + arguments: {'urlStr': AppConsts.userPrivacyPolicyUrl, 'webViewTitle': '隐私协议'}) + }, + style: normalButtonStyle, + child: Text( + "隐私协议", + style: textStyle21sp, + )), + 30.verticalSpace, + OutlinedButton( + onPressed: () => {userBloc.add(UserLogout())}, + style: ButtonStyle( + side: MaterialStateProperty.all(BorderSide(color: const Color(0xFF140C10), width: 1.5)), + shape: MaterialStateProperty.all( + RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.r))), + minimumSize: MaterialStateProperty.all(Size(295.w, 40.h)), + backgroundColor: MaterialStateProperty.all(Color(0xFFFBB621)), + ), + child: Text( + "退出登陆", + style: TextStyle( + //fontWeight: FontWeight.w600, + color: Colors.white, + fontSize: 17.sp, + ), + )), + ], + ), + )); + }, + ); } diff --git a/lib/route/route.dart b/lib/route/route.dart index 4a3a353..b95a971 100644 --- a/lib/route/route.dart +++ b/lib/route/route.dart @@ -24,6 +24,8 @@ class AppRouteName { static const String login = 'login'; static const String home = 'home'; static const String fogPwd = 'fogPwd'; + + /// 设置密码,修改密码;不要自己调用,使用[SetPassWordPage.push]方法 static const String setPwd = 'setPwd'; static const String webView = 'webView'; static const String lesson = 'lesson'; @@ -39,7 +41,9 @@ class AppRouteName { static const String voiceAnswer = 'voiceAnswer'; static const String user = 'user'; static const String lookVideo = 'lookVideo'; - static const String reading = 'reading'; ///绘本 + static const String reading = 'reading'; + + ///绘本 static const String tab = '/'; } @@ -64,7 +68,10 @@ class AppRouter { if (settings.arguments != null) { moduleId = (settings.arguments as Map)['moduleId'] as String; } - return CupertinoPageRoute(builder: (_) => HomePage(moduleId: moduleId,)); + return CupertinoPageRoute( + builder: (_) => HomePage( + moduleId: moduleId, + )); case AppRouteName.fogPwd: return CupertinoPageRoute(builder: (_) => const ForgetPasswordHomePage()); case AppRouteName.lesson: @@ -86,10 +93,22 @@ class AppRouter { case AppRouteName.lookVideo: final videoUrl = (settings.arguments as Map)['videoUrl'] as String; final title = (settings.arguments as Map)['title'] as String?; - return CupertinoPageRoute(builder: (_) => LookVideoPage(videoUrl: videoUrl,typeTitle: title,)); + 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)); + var map = settings.arguments as Map; + final phoneNum = map['phoneNumber'] as String?; + final smsCode = map['smsCode'] as String?; + final pageType = map['pageType'] as SetPwdPageType; + return CupertinoPageRoute( + builder: (_) => SetPassWordPage( + phoneNum: phoneNum, + smsCode: smsCode, + pageType: pageType, + )); case AppRouteName.webView: final urlStr = (settings.arguments as Map)['urlStr'] as String; final webViewTitle = (settings.arguments as Map)['webViewTitle'] as String; diff --git a/lib/utils/toast_util.dart b/lib/utils/toast_util.dart new file mode 100644 index 0000000..1fc994b --- /dev/null +++ b/lib/utils/toast_util.dart @@ -0,0 +1,18 @@ +import 'package:flutter_easyloading/flutter_easyloading.dart'; + +void showToast( + String msg, { + Duration? duration, + bool? dismissOnTap, +}) { + EasyLoading.showToast(msg, duration: duration, dismissOnTap: dismissOnTap); +} + +extension ToastExtension on String { + void toast({ + Duration? duration, + bool? dismissOnTap, + }) { + showToast(this, duration: duration, dismissOnTap: dismissOnTap); + } +} -- libgit2 0.22.2