user_page.dart 9.31 KB
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.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 = '';

  @override
  Widget build(BuildContext context) {
    return _pageWidget();
  }

  Widget _pageWidget() => BlocBuilder<UserBloc, UserState>(
    builder: (context, state) {
      UserEntity user = UserUtil.getUser()!;
      final userBloc = BlocProvider.of<UserBloc>(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: const WEAppBar(),
          body: SafeArea(
            child: SingleChildScrollView(
              padding: EdgeInsets.only(left: 17.w, right: 17.w, top: 10.h, bottom: 22.h),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  // 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,
                                    child: Image.asset(
                                      AssetsConst.icVip,
                                      height: 18.h,
                                    ),
                                  )
                                ],
                              ),
                              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: () {
                          pushNamed(AppRouteName.userInformation);
                        },
                      )
                    ],
                  ),
                  30.verticalSpace,
                  OutlinedButton(
                    onPressed: () => pushNamed(AppRouteName.fogPwd),
                    style: normalButtonStyle,
                    child: Text(
                      "修改密码",
                      style: textStyle21sp,
                    ),
                  ),
                  12.verticalSpace,
                  // todo 为了过审,把测试账号兑换功能下掉
                  Offstage(
                    offstage: UserUtil.getUser()?.phoneNum == '17730280759',
                    child: OutlinedButton(
                        onPressed: () => pushNamed(AppRouteName.exLesson),
                        style: normalButtonStyle,
                        child: Text(
                          "兑换课程",
                          style: textStyle21sp,
                        )),
                  ),
                  Offstage(
                    offstage: UserUtil.getUser()?.phoneNum == '17730280759',
                    child: 12.verticalSpace,
                  ),
                  OutlinedButton(
                      onPressed: () {
                        pushNamed(AppRouteName.webView,arguments: {'urlStr': AppConsts.userPrivacyPolicyUrl, 'webViewTitle': '隐私协议'});
                      },
                      style: normalButtonStyle,
                      child: Text(
                        "隐私协议",
                        style: textStyle21sp,
                      )),
                  30.verticalSpace,
                  OutlinedButton(
                      onPressed: () {
                        showTwoActionDialog(barrierDismissible:false,'提示', '取消', '确认', '您确认要退出Wow English吗?', () {
                          popPage();
                        }, () {
                          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,
                        ),
                      )),
                ],
              ),
            ),
          ));
    },
  );
}