diff --git a/assets/images/steven_bride.png b/assets/images/steven_bride.png new file mode 100644 index 0000000..0696613 --- /dev/null +++ b/assets/images/steven_bride.png diff --git a/lib/common/pages/wow_web_page.dart b/lib/common/pages/wow_web_page.dart new file mode 100644 index 0000000..2f8859e --- /dev/null +++ b/lib/common/pages/wow_web_page.dart @@ -0,0 +1,82 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:limiting_direction_csx/limiting_direction_csx.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'package:wow_english/common/widgets/we_app_bar.dart'; + +class WowWebViewPage extends StatefulWidget { + const WowWebViewPage({super.key, required this.urlStr, required this.webViewTitle}); + + final String urlStr; + final String webViewTitle; + + @override + State createState() { + return _WowWebViewPageState(); + } +} + +class _WowWebViewPageState extends State { + + late final WebViewController _controller; + + @override + void initState() { + super.initState(); + + if (Platform.isIOS) { + LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.PortraitUpsideDown); + } else { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + } + + final WebViewController controller =WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) { + EasyLoading.show(); + }, + onPageFinished: (String url) { + EasyLoading.dismiss(); + }, + onWebResourceError: (WebResourceError error) { + EasyLoading.showError(error.description); + }, + onNavigationRequest: (NavigationRequest request) { + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.urlStr)); + _controller = controller; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: WEAppBar( + titleText: widget.webViewTitle, + ), + body: WebViewWidget(controller: _controller,), + ); + } + + @override + void deactivate() { + super.deactivate(); + if (Platform.isIOS) { + LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape); + } else { + SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight]); + } + } +} \ No newline at end of file diff --git a/lib/widgets/we_app_bar.dart b/lib/common/widgets/we_app_bar.dart index a40fae7..a40fae7 100644 --- a/lib/widgets/we_app_bar.dart +++ b/lib/common/widgets/we_app_bar.dart diff --git a/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart b/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart index 85c3ab6..f3b5a81 100644 --- a/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart +++ b/lib/login/forgetpwd/bloc/forget_pwd_home_bloc.dart @@ -1,15 +1,65 @@ -import 'dart:async'; - -import 'package:bloc/bloc.dart'; -import 'package:meta/meta.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_bloc/flutter_bloc.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(); + final TextEditingController checkNumController = TextEditingController(); + ForgetPwdHomeBloc() : super(ForgetPwdHomeInitial()) { - on((event, emit) { - // TODO: implement event handler - }); + on(_changePhoneNumber); + on(_changeCodeNumber); + on(_setPassWord); + on(_sendSmsCode); + } + + void _changePhoneNumber(PhoneNumChangeEvent event, Emitter emitter) async { + if (phoneNumController.text.isNotEmpty) { + if (!_canSendSms) { + _canSendSms = true; + emitter(SendSmsCodeTypeChangeState()); + emitter(SetPwdTypeChangeState()); + } + } else { + if (_canSendSms) { + _canSendSms = false; + emitter(SendSmsCodeTypeChangeState()); + emitter(SetPwdTypeChangeState()); + } + } + } + + void _changeCodeNumber(CheckCodeChangeEvent event, Emitter emitter) async { + if (checkNumController.text.isNotEmpty) { + if (!_canSetPwd) { + _canSetPwd = true; + emitter(SendSmsCodeTypeChangeState()); + emitter(SetPwdTypeChangeState()); + } + } else { + if (_canSetPwd) { + _canSetPwd = false; + emitter(SendSmsCodeTypeChangeState()); + emitter(SetPwdTypeChangeState()); + } + } + } + + void _setPassWord(SetPassWordEvent event,Emitter emitter) async { + + } + + void _sendSmsCode(SendSmsCodeEvent event,Emitter emitter) async { + } } diff --git a/lib/login/forgetpwd/bloc/forget_pwd_home_event.dart b/lib/login/forgetpwd/bloc/forget_pwd_home_event.dart index 46ab94e..0be0181 100644 --- a/lib/login/forgetpwd/bloc/forget_pwd_home_event.dart +++ b/lib/login/forgetpwd/bloc/forget_pwd_home_event.dart @@ -2,3 +2,11 @@ part of 'forget_pwd_home_bloc.dart'; @immutable abstract class ForgetPwdHomeEvent {} + +class PhoneNumChangeEvent extends ForgetPwdHomeEvent {} + +class CheckCodeChangeEvent extends ForgetPwdHomeEvent {} + +class SetPassWordEvent extends ForgetPwdHomeEvent {} + +class SendSmsCodeEvent extends ForgetPwdHomeEvent {} diff --git a/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart b/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart index d4d653d..06ddf01 100644 --- a/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart +++ b/lib/login/forgetpwd/bloc/forget_pwd_home_state.dart @@ -4,3 +4,7 @@ part of 'forget_pwd_home_bloc.dart'; abstract class ForgetPwdHomeState {} class ForgetPwdHomeInitial extends ForgetPwdHomeState {} + +class SendSmsCodeTypeChangeState extends ForgetPwdHomeState {} + +class SetPwdTypeChangeState extends ForgetPwdHomeState {} diff --git a/lib/login/forgetpwd/forget_password_home_page.dart b/lib/login/forgetpwd/forget_password_home_page.dart index f399296..e09f174 100644 --- a/lib/login/forgetpwd/forget_password_home_page.dart +++ b/lib/login/forgetpwd/forget_password_home_page.dart @@ -2,6 +2,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/extension/string_extension.dart'; +import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; import 'package:wow_english/login/forgetpwd/bloc/forget_pwd_home_bloc.dart'; class ForgetPasswordHomePage extends StatelessWidget { @@ -25,7 +26,7 @@ class ForgetPasswordHomePage extends StatelessWidget { child: ListView( children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 40.w), + padding: EdgeInsets.only(left: 49.w,right: 10.w), child: Column( children: [ 34.verticalSpace, @@ -45,6 +46,122 @@ class ForgetPasswordHomePage extends StatelessWidget { ), ) ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + 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, + ) + ) + ], + ), + 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, + GestureDetector( + onTap: () { + if (bloc.canSendSms) { + bloc.add(SendSmsCodeEvent()); + } + }, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng + ), + fit: BoxFit.fill + ), + ), + padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0), + child: const Text( + '获取验证码', + style: TextStyle( + fontSize: 16, + color: Colors.white + ), + ), + ), + ) + ], + ) + ], + ) + ), + 2.verticalSpace, + Image.asset( + 'steven_bride'.assetPng, + height: 173.h, + width: 157.w, + ) + ], + ), + GestureDetector( + onTap: () { + if (bloc.canSetPwd) { + bloc.add(SetPassWordEvent()); + } + }, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + bloc.canSetPwd?'login_enter'.assetPng:'login_enter_dis'.assetPng + ), + fit: BoxFit.fill + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 28.0, + vertical: 14.0 + ), + child:const Text( + '确定', + style: TextStyle( + fontSize: 16 + ), + ), + ), ) ], ), diff --git a/lib/login/loginpage/bloc/login_bloc.dart b/lib/login/loginpage/bloc/login_bloc.dart index be5912c..d171698 100644 --- a/lib/login/loginpage/bloc/login_bloc.dart +++ b/lib/login/loginpage/bloc/login_bloc.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; part 'login_event.dart'; @@ -16,11 +19,15 @@ class LoginBloc extends Bloc { bool _canLogin = false; ///是否可以发送验证码 bool _canSendSms = false; + ///正在发送验证码 + bool _sendSmsIng = false; ///是否阅读协议 bool _agreement = false; ///登陆方式 LoginType _loginType = LoginType.sms; + int _countDown = 0; + final TextEditingController phoneNumController = TextEditingController(); final TextEditingController checkNumController = TextEditingController(); @@ -28,6 +35,8 @@ class LoginBloc extends Bloc { bool get agreement => _agreement; LoginType get loginType => _loginType; bool get canSendSms => _canSendSms; + int get countDown => _countDown; + bool get sendSmsIng => _sendSmsIng; LoginBloc() : super(LoginInitial()) { on(_requestLoginApi); @@ -36,6 +45,8 @@ class LoginBloc extends Bloc { on(_agreementTypeChange); on(_forgetPassword); on(_checkFiledChange); + on(_countDownChange); + on(_cancelTimer); } @@ -100,6 +111,17 @@ class LoginBloc extends Bloc { } + ///倒计时 + void _countDownChange(CountDownEvent event, Emitter emitter) { + _sendSmsIng = !_sendSmsIng; + emitter(CountDownNumChangeState()); + } + + void _cancelTimer(CancelCountDownEvent event,Emitter emitter) { + + } + + ///登陆状态判断 bool _loginStateChange() { if (_agreement) { if (phoneNumController.text.isNotEmpty && checkNumController.text.isNotEmpty) { diff --git a/lib/login/loginpage/bloc/login_event.dart b/lib/login/loginpage/bloc/login_event.dart index 7922b5c..27b6b32 100644 --- a/lib/login/loginpage/bloc/login_event.dart +++ b/lib/login/loginpage/bloc/login_event.dart @@ -14,3 +14,7 @@ class CheckFieldChangeEvent extends LoginEvent {} class AgreementChangeEvent extends LoginEvent {} class ForgetPasswordEvent extends LoginEvent {} + +class CountDownEvent extends LoginEvent {} + +class CancelCountDownEvent extends LoginEvent {} diff --git a/lib/login/loginpage/bloc/login_state.dart b/lib/login/loginpage/bloc/login_state.dart index 030cdf2..f1d0b1c 100644 --- a/lib/login/loginpage/bloc/login_state.dart +++ b/lib/login/loginpage/bloc/login_state.dart @@ -12,3 +12,5 @@ class LoginTypeChangeState extends LoginState {} class SmsSendTypeChangeState extends LoginState {} class AgreementTypeChangeState extends LoginState {} + +class CountDownNumChangeState extends LoginState {} diff --git a/lib/login/loginpage/login_page.dart b/lib/login/loginpage/login_page.dart index 9544627..a08684d 100644 --- a/lib/login/loginpage/login_page.dart +++ b/lib/login/loginpage/login_page.dart @@ -1,14 +1,12 @@ -import 'package:common_utils/common_utils.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/textfield_customer_widget.dart'; import 'package:wow_english/login/loginpage/bloc/login_bloc.dart'; import 'package:wow_english/route/route.dart'; - class LoginPage extends StatelessWidget { const LoginPage({super.key}); @@ -77,7 +75,54 @@ class LoginPage extends StatelessWidget { color:bloc.agreement ? Colors.green:Colors.black), ), 6.horizontalSpace, - const Text('我已阅读并同意《用户隐私协议》,《儿童隐私策略》') + RichText( + text: TextSpan( + children:[ + const TextSpan( + text: '我已阅读并同意', + style: TextStyle( + fontSize: 12, + color: Color(0xFF333333), + ) + ), + TextSpan( + text: '《用户隐私协议》', + style: const TextStyle( + fontSize: 12, + color: Color(0xFF333333), + ), + recognizer: TapGestureRecognizer()..onTap = (){ + Navigator.of(context).pushNamed( + AppRouteName.webView, + arguments: { + 'urlStr':'https://www.zhihu.com', + 'webViewTitle':'用户隐私协议' + }); + }), + const TextSpan( + text: ',', + style: TextStyle( + fontSize: 12, + color: Color(0xFF333333) + ) + ), + TextSpan( + text: '《儿童隐私政策》', + style: const TextStyle( + fontSize: 12, + color: Color(0xFF333333) + ), + recognizer: TapGestureRecognizer()..onTap = (){ + Navigator.of(context).pushNamed( + AppRouteName.webView, + arguments: { + 'urlStr':'https://www.zhihu.com', + 'webViewTitle':'儿童隐私协议' + }); + }) + ] + ), + ) ], ), GestureDetector( @@ -142,21 +187,21 @@ class LoginPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: TextFieldCustomerWidget( - height: 50.h, - hitText: '请输入验证码', - textInputType: TextInputType.number, - bgImageName: 'Input_layer_down', - onChangeValue: (String value) { - bloc.add(CheckFieldChangeEvent()); - }, - controller: bloc.checkNumController, - ) + child: TextFieldCustomerWidget( + height: 50.h, + hitText: '请输入验证码', + textInputType: TextInputType.number, + bgImageName: 'Input_layer_down', + onChangeValue: (String value) { + bloc.add(CheckFieldChangeEvent()); + }, + controller: bloc.checkNumController, + ) ), GestureDetector( onTap: () { if (bloc.canSendSms) { - bloc.add(ChangeLoginTypeEvent()); + bloc.add(CountDownEvent()); } }, child: Container( @@ -169,8 +214,8 @@ class LoginPage extends StatelessWidget { ), ), padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0), - child: const Text( - '获取验证码' + child: Text( + !bloc.sendSmsIng ? '获取验证码':'${bloc.countDown}s后在次获取' ), ), ) @@ -228,22 +273,18 @@ class LoginPage extends StatelessWidget { ), 10.5.horizontalSpace, Expanded( - child: TextFieldCustomerWidget( - hitText: '请输入密码', - bgImageName: 'Input_layer_down', - onChangeValue: (String value) { - bloc.add(CheckFieldChangeEvent()); - }, - controller: bloc.checkNumController, - ) + child: TextFieldCustomerWidget( + hitText: '请输入密码', + bgImageName: 'Input_layer_down', + onChangeValue: (String value) { + bloc.add(CheckFieldChangeEvent()); + }, + controller: bloc.checkNumController, + ) ), 5.horizontalSpace, GestureDetector( onTap: () { - if(!RegexUtil.isMobileExact(bloc.phoneNumController.text)) { - Fluttertoast.showToast(msg: '手机号不正确!'); - return; - } Navigator.of(context).pushNamed(AppRouteName.fogPwd); }, child: Container( @@ -261,5 +302,338 @@ class LoginPage extends StatelessWidget { ), ); }); - } + +// class LoginPage extends StatefulWidget { +// const LoginPage({super.key}); +// +// @override +// State createState() { +// return _LoginPageState(); +// } +// +// } +// +// class _LoginPageState extends State { +// late Timer _timer; +// int _countdownTime = 0; +// +// void startCountdownTimer(BuildContext context) { +// final bloc = BlocProvider.of(context); +// if (bloc.sendSmsIng) { +// return; +// } +// bloc.add(CancelCountDownEvent()); +// const oneSec = Duration(seconds: 1); +// _countdownTime = 60; +// _timer = Timer.periodic(oneSec,(timer) { +// setState(() { +// if (_countdownTime < 1) { +// bloc.add(CancelCountDownEvent()); +// _timer.cancel(); +// } else { +// _countdownTime = _countdownTime - 1; +// } +// }); +// if (kDebugMode) { +// print(_countdownTime); +// } +// }); +// } +// +// +// +// @override +// Widget build(BuildContext context) { +// return BlocProvider( +// create: (context) => LoginBloc(), +// child: _buildLoginViewWidget(), +// ); +// } +// +// Widget _buildLoginViewWidget() => BlocBuilder ( +// builder: (context, state) { +// final bloc = BlocProvider.of(context); +// return Scaffold( +// body: SafeArea( +// child: ListView( +// children: [ +// Container( +// padding: EdgeInsets.only(top: 25.h), +// child: Stack( +// children: [ +// Positioned( +// right: 29.w, +// child: GestureDetector( +// onTap: () => bloc.add(ChangeLoginTypeEvent()), +// child: Container( +// decoration: BoxDecoration( +// image: DecorationImage( +// image: AssetImage( +// 'login_logo'.assetPng +// ), +// fit: BoxFit.fill +// ), +// ), +// padding: const EdgeInsets.symmetric(horizontal: 18.0), +// child: Text( +// bloc.loginType == LoginType.sms?'密码登陆':'验证码密码' +// ), +// ), +// ) +// ), +// Center( +// child: Column( +// children: [ +// Image.asset( +// 'wow_logo'.assetPng, +// height: 81.h, +// width: 131.w, +// ), +// Offstage( +// offstage: bloc.loginType == LoginType.pwd, +// child: _buildSmsViewWidget(), +// ), +// Offstage( +// offstage: bloc.loginType == LoginType.sms, +// child: _buildPwdViewWidget(), +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// GestureDetector( +// onTap: () => bloc.add(AgreementChangeEvent()), +// child: Icon( +// bloc.agreement ? Icons.check_circle_outlined:Icons.circle_outlined, +// color:bloc.agreement ? Colors.green:Colors.black), +// ), +// 6.horizontalSpace, +// RichText( +// text: TextSpan( +// children:[ +// const TextSpan( +// text: '我已阅读并同意', +// style: TextStyle( +// fontSize: 12, +// color: Color(0xFF333333), +// ) +// ), +// TextSpan( +// text: '《用户隐私协议》', +// style: const TextStyle( +// fontSize: 12, +// color: Color(0xFF333333), +// ), +// recognizer: TapGestureRecognizer()..onTap = (){ +// Navigator.of(context).pushNamed( +// AppRouteName.webView, +// arguments: { +// 'urlStr':'https://www.zhihu.com', +// 'webViewTitle':'用户隐私协议' +// }); +// }), +// const TextSpan( +// text: ',', +// style: TextStyle( +// fontSize: 12, +// color: Color(0xFF333333) +// ) +// ), +// TextSpan( +// text: '《儿童隐私政策》', +// style: const TextStyle( +// fontSize: 12, +// color: Color(0xFF333333) +// ), +// recognizer: TapGestureRecognizer()..onTap = (){ +// Navigator.of(context).pushNamed( +// AppRouteName.webView, +// arguments: { +// 'urlStr':'https://www.zhihu.com', +// 'webViewTitle':'儿童隐私协议' +// }); +// }) +// ] +// ), +// ) +// ], +// ), +// GestureDetector( +// onTap: () { +// if (bloc.canLogin) { +// bloc.add(RequestLoginEvent()); +// } +// }, +// child: Container( +// decoration: BoxDecoration( +// image: DecorationImage( +// image: AssetImage( +// bloc.canLogin?'login_enter'.assetPng:'login_enter_dis'.assetPng +// ), +// fit: BoxFit.fill +// ), +// ), +// padding: const EdgeInsets.symmetric( +// horizontal: 28.0, +// vertical: 14.0 +// ), +// child: const Text( +// '登录' +// ), +// ), +// ) +// ], +// ), +// ) +// ], +// ), +// ) +// ], +// ), +// ), +// ); +// }, +// ); +// +// Widget _buildSmsViewWidget()=> BlocBuilder( +// builder: (context,state){ +// final bloc = BlocProvider.of(context); +// return Padding( +// padding: EdgeInsets.symmetric(horizontal: 135.w), +// child: Column( +// children: [ +// 15.verticalSpace, +// TextFieldCustomerWidget( +// height: 55.h, +// hitText: '请输入手机号', +// textInputType: TextInputType.phone, +// bgImageName: 'Input_layer_up', +// onChangeValue: (String value) { +// bloc.add(PhoneNumChangeEvent()); +// }, +// controller: bloc.phoneNumController, +// ), +// 6.5.verticalSpace, +// const Text('未注册用户登录默认注册'), +// 4.5.verticalSpace, +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Expanded( +// child: TextFieldCustomerWidget( +// height: 50.h, +// hitText: '请输入验证码', +// textInputType: TextInputType.number, +// bgImageName: 'Input_layer_down', +// onChangeValue: (String value) { +// bloc.add(CheckFieldChangeEvent()); +// }, +// controller: bloc.checkNumController, +// ) +// ), +// GestureDetector( +// onTap: () { +// if (bloc.canSendSms) { +// +// } +// }, +// child: Container( +// decoration: BoxDecoration( +// image: DecorationImage( +// image: AssetImage( +// bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng +// ), +// fit: BoxFit.fill +// ), +// ), +// padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0), +// child: Text( +// !bloc.sendSmsIng ? '获取验证码':'${bloc.countDown}s后在次获取' +// ), +// ), +// ) +// ], +// ) +// ], +// ), +// ); +// }); + + // Widget _buildPwdViewWidget()=> BlocBuilder( + // builder: (context,state){ + // final bloc = BlocProvider.of(context); + // return Padding( + // padding: EdgeInsets.symmetric(horizontal: 90.w), + // child: Column( + // children: [ + // 15.verticalSpace, + // Row( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Image.asset( + // 'phone'.assetPng, + // height: 45.h, + // width: 35.w, + // ), + // 10.5.horizontalSpace, + // Expanded( + // child: TextFieldCustomerWidget( + // height: 50.h, + // hitText: '请输入手机号', + // textInputType: TextInputType.phone, + // bgImageName: 'Input_layer_up', + // onChangeValue: (String value) { + // bloc.add(PhoneNumChangeEvent()); + // }, + // controller: bloc.phoneNumController, + // ) + // ), + // 5.horizontalSpace, + // SizedBox( + // width: 100.w, + // height: 55.h, + // ) + // ], + // ), + // 12.verticalSpace, + // Row( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Image.asset( + // 'lock'.assetPng, + // height: 34.h, + // width: 31.w, + // ), + // 10.5.horizontalSpace, + // Expanded( + // child: TextFieldCustomerWidget( + // hitText: '请输入密码', + // bgImageName: 'Input_layer_down', + // onChangeValue: (String value) { + // bloc.add(CheckFieldChangeEvent()); + // }, + // controller: bloc.checkNumController, + // ) + // ), + // 5.horizontalSpace, + // GestureDetector( + // onTap: () { + // Navigator.of(context).pushNamed(AppRouteName.fogPwd); + // }, + // child: Container( + // width: 100.w, + // height: 55.h, + // alignment: Alignment.centerLeft, + // child: const Text( + // '忘记密码 ?' + // ), + // ), + // ) + // ], + // ) + // ], + // ), + // ); + // }); + + diff --git a/lib/pages/page1.dart b/lib/pages/page1.dart index 5bfb0ca..88ca5bc 100644 --- a/lib/pages/page1.dart +++ b/lib/pages/page1.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:wow_english/widgets/we_app_bar.dart'; +import 'package:wow_english/common/widgets/we_app_bar.dart'; class Page1 extends StatelessWidget { const Page1({super.key}); diff --git a/lib/pages/page2.dart b/lib/pages/page2.dart index fb2782a..5cf8126 100644 --- a/lib/pages/page2.dart +++ b/lib/pages/page2.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:wow_english/widgets/we_app_bar.dart'; +import 'package:wow_english/common/widgets/we_app_bar.dart'; class Page2 extends StatelessWidget { const Page2({super.key}); diff --git a/lib/route/route.dart b/lib/route/route.dart index 18d519e..1971f04 100644 --- a/lib/route/route.dart +++ b/lib/route/route.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:wow_english/app/splash_page.dart'; +import 'package:wow_english/common/pages/wow_web_page.dart'; import 'package:wow_english/home/home_page.dart'; import 'package:wow_english/login/forgetpwd/forget_password_home_page.dart'; import 'package:wow_english/login/loginpage/login_page.dart'; @@ -14,6 +15,7 @@ class AppRouteName { static const String home = 'home'; static const String fogPwd = 'fogPwd'; static const String setPwd = 'setPwd'; + static const String webView = 'webView'; static const String tab = '/'; } @@ -39,6 +41,10 @@ class AppRouter { case AppRouteName.setPwd: final phoneNum = (settings.arguments as Map)['phoneNumber'] as String; return CupertinoPageRoute(builder: (_) => SetPassWordPage(phoneNum: phoneNum)); + case AppRouteName.webView: + final urlStr = (settings.arguments as Map)['urlStr'] as String; + final webViewTitle = (settings.arguments as Map)['webViewTitle'] as String; + return CupertinoPageRoute(builder: (_) => WowWebViewPage(urlStr: urlStr,webViewTitle: webViewTitle,)); case AppRouteName.tab: return PageRouteBuilder( opaque: false, diff --git a/pubspec.yaml b/pubspec.yaml index e19de58..6dc5b2c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,7 +46,7 @@ dependencies: #Url跳转 https://pub.dev/packages/url_launcher url_launcher: ^6.1.11 #网页加载 https://pub.dev/packages/webview_flutter - webview_flutter: ^4.2.0 + webview_flutter: ^4.2.2 #下拉刷新 https://pub.dev/packages/pull_to_refresh pull_to_refresh: ^2.0.0 # 数据持久化 https://pub.dev/packages/shared_preferences @@ -83,6 +83,8 @@ dependencies: connectivity_plus: ^4.0.1 # iOS设备方向控制 https://pub.dev/packages/limiting_direction_csx limiting_direction_csx: ^0.2.0 + # 富文本插件 https://pub.dev/packages/extended_text + extended_text: ^11.0.1 dev_dependencies: build_runner: ^2.4.4