user_page.dart 9.17 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 BlocProvider(
      create: (context) => UserBloc(),
      child: const _UserView(),
    );
  }
}

class _UserView extends StatelessWidget {
  const _UserView({super.key});

  final String bannerUrl = '';

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

  Widget _pageWidget() => BlocBuilder<UserBloc, UserState>(
        /*buildWhen: (previous, current) {
          return current != previous;
        },*/
        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(
              //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: <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: () {
                            Navigator.of(AppRouter.context).pushNamed(AppRouteName.userInformation);
                          },
                        )
                      ],
                    ),
                    30.verticalSpace,
                    OutlinedButton(
                      onPressed: () => Navigator.of(context).pushNamed(AppRouteName.fogPwd),
                      style: normalButtonStyle,
                      child: Text(
                        "修改密码",
                        style: textStyle21sp,
                      ),
                    ),
                    12.verticalSpace,
                    OutlinedButton(
                        onPressed: () => Navigator.of(context).pushNamed(AppRouteName.exLesson),
                        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,
                          ),
                        )),
                    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,
                          ),
                        )),
                  ],
                ),
              ));
        },
      );
}