import 'package:flutter/cupertino.dart'; 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: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/textfield_customer_widget.dart'; import 'package:wow_english/common/widgets/we_app_bar.dart'; import 'package:wow_english/pages/user/bloc/user_bloc.dart'; import 'package:wow_english/pages/user/modify/user_info_bloc/user_info_bloc.dart'; import 'package:wow_english/route/route.dart'; import 'package:wow_english/utils/toast_util.dart'; enum ModifyUserInformationType { avatar('头像'), name('名字'), age('年龄'), gender('性别'); const ModifyUserInformationType(this.title); final String title; } class ModifyUserInformationPage extends StatelessWidget { final ModifyUserInformationType type; const ModifyUserInformationPage({super.key, required this.type}); static push(BuildContext context, ModifyUserInformationType type) { Navigator.of(context).push(CupertinoPageRoute(builder: (context) { return ModifyUserInformationPage(type: type); })); } @override Widget build(BuildContext context) { String text = ''; if (type == ModifyUserInformationType.age) { text = UserUtil.getUser()!.age.toString(); } else if (type == ModifyUserInformationType.name) { text = UserUtil.getUser()!.name; } return BlocProvider( create: (context) => UserInfoBloc()..add(InitControllerTextEvent(text)), child: MultiBlocListener( listeners: [ BlocListener(listener: (context, state) { if (state is UserInfoUpdated) { showToast('修改成功'); popPage(); } }) ], child: BlocBuilder( builder: (context, state) { final bloc = BlocProvider.of(context); return Scaffold( backgroundColor: Colors.white, appBar: WEAppBar( titleText: '修改${type.title}', onBack: () { final bloc = BlocProvider.of(context); if (bloc.isChangeInfo) { showTwoActionDialog('提示', '确定离开', '继续修改', '您的信息尚未保存', leftTap: () { popPage(); popPage(); }, rightTap: () { popPage(); }); } else { popPage(); } }, ), body: SingleChildScrollView( child: Column( children: [ Padding( padding: EdgeInsets.only(left: 65.w, right: 55.w, top: 38.h), child: Row( children: [ Text( type.title, style: TextStyle( fontWeight: FontWeight.w700, color: const Color(0xFF333333), fontSize: 21.sp, ), ), 20.horizontalSpace, // 输入框 or 选择框 _buildTextFieldWidget(context), // 占位 Expanded( child: Container(), ), // 按钮 GestureDetector( onTap: () { var text = ''; if (type == ModifyUserInformationType.name || type == ModifyUserInformationType.age) { if (bloc.modifyTextController.text.isEmpty) { showToast('内容不能为空'); return; } text = bloc.modifyTextController.text; } if (type == ModifyUserInformationType.gender) { text = bloc.gender.toString(); } // 更新type类型的字段 context .read() .add(UserUpdate(type, text)); }, child: Container( alignment: Alignment.center, width: 90.w, height: 44.h, decoration: const BoxDecoration( image: DecorationImage( image: AssetImage(AssetsConst.bgButtonBlue), fit: BoxFit.fill), ), child: Text( '确定', style: TextStyle( fontSize: 17.sp, color: Colors.white), ), ), ) ], )), Stack( alignment: Alignment.topRight, children: [ Image.asset( AssetsConst.bgEditUserInformation, width: double.infinity, ), Positioned( right: 125.w, top: 10.h, child: Image.asset(AssetsConst.bgIcSteveWrite, width: 161.w, height: 249.w), ), ], ), ], )), ); }, ), ), ); } Widget _buildTextFieldWidget(BuildContext context) { if (type == ModifyUserInformationType.gender) { return BlocBuilder( builder: (context, state) { final bloc = BlocProvider.of(context); return Row( children: [ GestureDetector( onTap: () => bloc.add(ChangeGenderEvent(0)), child: _buildSexWidget('男', bloc.gender == 0), ), 70.horizontalSpace, GestureDetector( onTap: () => bloc.add(ChangeGenderEvent(1)), child: _buildSexWidget('女', bloc.gender == 1), ) ], ); }); } var formatters = [ LengthLimitingTextInputFormatter(12), FilteringTextInputFormatter.deny(RegExp('[ ]')), ]; var inputType = TextInputType.name; // 当输入年龄时 if (type == ModifyUserInformationType.age) { formatters = [ LengthLimitingTextInputFormatter(2), FilteringTextInputFormatter.deny(RegExp('[ ]')), ]; inputType = TextInputType.number; } return BlocBuilder(builder: (context, state) { final bloc = BlocProvider.of(context); return TextFieldCustomerWidget( height: 65.h, width: 222.w, textStyle: TextStyle( fontWeight: FontWeight.w700, color: const Color(0xFF333333), fontSize: 21.sp, ), bgImageName: 'Input_layer_up', textInputType: inputType, inputFormatters: formatters, controller: bloc.modifyTextController, onChangeValue: (String value) { bloc.add(ChangeTextFieldEvent(value)); }, ); }); } Widget _buildSexWidget(String title, bool isSelect) { return Row( children: [ Container( width: 21.h, height: 21.h, padding: EdgeInsets.all(4.h), decoration: BoxDecoration( borderRadius: BorderRadius.circular(21.r), border: Border.all(color: const Color(0xFF140C10), width: 1.5)), child: Offstage( offstage: !isSelect, child: ClipRRect( borderRadius: BorderRadius.circular(13.r), child: Container( color: Colors.blue, ), ), ), ), 5.horizontalSpace, Text(title) ], ); } }