import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:wow_english/common/core/app_config_helper.dart'; import 'package:wow_english/common/core/app_consts.dart'; import 'package:wow_english/common/core/assets_const.dart'; import 'package:wow_english/common/core/user_util.dart'; import 'package:wow_english/common/dialogs/show_dialog.dart'; import 'package:wow_english/common/widgets/we_app_bar.dart'; import 'package:wow_english/models/user_entity.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}); @override Widget build(BuildContext context) { return _UserView(); } } class _UserView extends StatelessWidget { final String bannerUrl = ''; /// 方法 final MethodChannel methodChannel = const MethodChannel('wow_english/game_method_channel'); @override Widget build(BuildContext context) { return _pageWidget(); } Widget _pageWidget() => BlocBuilder( builder: (context, state) { UserEntity user = UserUtil.getUser()!; final userBloc = BlocProvider.of(context); // 常规按钮的字体样式 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( appBar: WEAppBar( onBack: () { popPage(data: {'exchange': userBloc.exchangeResult}); }, ), body: SingleChildScrollView( padding: EdgeInsets.only( left: 17.w, right: 17.w, top: 10.h, bottom: 22.h), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // todo banner,暂时没有接口获取banner URL /*Offstage( child: Column( children: [ Container(child: Image.asset(bannerUrl), constraints: BoxConstraints(maxHeight: 196.h)), 30.verticalSpace, ], ), ),*/ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CircleAvatar( radius: 40.r, backgroundColor: const Color(0xFF140C10), child: CircleAvatar( radius: 38.5.r, backgroundImage: ImageUtil.getImageProviderOnDefault( user.avatarUrl), ), /*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.getGenderString(), style: textStyle21sp, ), 14.horizontalSpace, Offstage( offstage: user.effectiveDate == null || AppConfigHelper.shouldHidePay(), child: Image.asset( AssetsConst.icVip, height: 18.h, ), ) ], ), Offstage( offstage: user.effectiveDate == null || AppConfigHelper.shouldHidePay(), child: Row( children: [ Text( "${user.getEffectiveDate()} 到期", style: TextStyle( color: const Color(0xFFE11212), fontSize: 17.sp, ), ) ], ), ) ], )), TextButton( child: Text( "修改个人信息>", style: textStyle21sp, ), onPressed: () { pushNamed(AppRouteName.userInformation); }, ) ], ), 30.verticalSpace, // 打开游戏界面 供审核用 ((UserUtil.getUser()?.phoneNum == '17730280759' || UserUtil.getUser()?.phoneNum == '17718485544') ? OutlinedButton( onPressed: () { methodChannel .invokeMethod('openGamePage', {"gameId": 1}); }, style: normalButtonStyle, child: Text( "进入游戏", style: textStyle21sp, ), ) : 1.verticalSpace), ((UserUtil.getUser()?.phoneNum == '17730280759' || UserUtil.getUser()?.phoneNum == '17718485544') ? 12.verticalSpace : 1.verticalSpace), Offstage( offstage: AppConfigHelper.shouldHidePay(), child: OutlinedButton( onPressed: () => pushNamed(AppRouteName.exLesson).then((value) => { if (value != null) { userBloc.exchangeResult = value['exchange'] } }), style: normalButtonStyle, child: Text( "兑换课程", style: textStyle21sp, )), ), 12.verticalSpace, OutlinedButton( onPressed: () => pushNamed(AppRouteName.fogPwd), style: normalButtonStyle, child: Text( "修改密码", style: textStyle21sp, ), ), Offstage( offstage: AppConfigHelper.shouldHidePay(), child: 12.verticalSpace, ), OutlinedButton( onPressed: () { pushNamed(AppRouteName.webView, arguments: { 'urlStr': AppConsts.userPrivacyPolicyUrl, 'webViewTitle': '隐私协议' }); }, style: normalButtonStyle, child: Text( "隐私协议", style: textStyle21sp, )), 12.verticalSpace, OutlinedButton( onPressed: () { String phone = 'tel:+8618827093087'; _launchPhone(phone); }, style: normalButtonStyle, child: Text( "联系客服", style: textStyle21sp, )), 12.verticalSpace, OutlinedButton( onPressed: () { pushNamed(AppRouteName.setting); }, style: normalButtonStyle, child: Text( "设置", style: textStyle21sp, )), 30.verticalSpace, OutlinedButton( onPressed: () { showTwoActionDialog( barrierDismissible: false, '提示', '取消', '确认', '您确认要退出Wow English吗?', leftTap: () { popPage(); }, rightTap: () { popPage(); userBloc.add(UserLogout()); }); }, style: ButtonStyle( side: MaterialStateProperty.all(const BorderSide( color: 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( const Color(0xFFFBB621)), ), child: Text( "退出登录", style: TextStyle( //fontWeight: FontWeight.w600, color: Colors.white, fontSize: 17.sp, ), )), // 30.verticalSpace, // TextButton( // onPressed: () { // //userBloc.add(UserDelete()) // showTwoActionDialog('注销账号', '取消', '注销', '请谨慎操作!\n注销后不可恢复哦!', () { // popPage(); // }, () { // userBloc.add(UserDelete()); // popPage(); // }); // }, // child: Text( // "注销账号", // style: TextStyle( // //fontWeight: FontWeight.w600, // color: Colors.red, // fontSize: 15.sp, // ), // )), ], ), )); }, ); void _launchPhone(String phone) async { if (await canLaunchUrl(Uri.parse(phone))) { await launchUrl(Uri.parse(phone)); } else { throw 'Could not phone $phone'; } } }