Files
tuiche/lib/pages/mh_page/user/page/register_page.dart
2025-06-21 08:49:40 +08:00

717 lines
43 KiB
Dart

import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/util/CommonVariables.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/CustomCard.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/pages/common/selectDialog.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart';
class RegisterPage extends GetView<MHTRegisterController> {
final scaffoldKey = GlobalKey<ScaffoldState>();
BoxConstraints? bodysize;
final ScrollController _scrollController = ScrollController();
RegisterPage() {
controller.model.pdshow = true;
controller.model.cpdshow = true;
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, cc) {
bodysize = cc;
return GestureDetector(
child: Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'),
fit: BoxFit.fill,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: AppBar(
backgroundColor: Colors.transparent,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(color: Colors.white),
titleSpacing: 0,
title: Container(
width: double.infinity,
height: 180.rpx,
child: Stack(
alignment: Alignment.center,
children: [
Text(
'用户注册',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 30.rpx,
),
),
Positioned(
left: 20.rpx,
child: returnIconButtomNew,
),
],
),
),
actions: [],
centerTitle: false,
),
body: SingleChildScrollView(
controller: _scrollController,
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 1,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
98.rpx, 0, 98.rpx, 0),
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 0.886,
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 1,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Align(
alignment: AlignmentDirectional(-1, 0),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 184.rpx, 0, 0),
child: Container(
width: double.infinity,
height: bodysize!.maxHeight * 0.06,
decoration: BoxDecoration(
color: Color(0xFFF3F5F6),
borderRadius: BorderRadius.circular(12),
),
constraints: BoxConstraints(
minHeight: 92.rpx,
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
35.rpx, 0, 35.rpx, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Container(
child: Align(
alignment:
AlignmentDirectional(
-1, 0),
child: TextFormField(
onChanged: (value) {
controller.model
.register_phone =
value;
},
decoration: InputDecoration(
isDense: true,
hintText: '请输入手机号'.tr,
hintStyle: TextStyle(
fontFamily:
'Readex Pro',
color:
Color(0xFF929699),
fontSize: 26.rpx,
),
border: InputBorder.none,
),
style: TextStyle(
fontFamily: 'Readex Pro',
fontSize: 26.rpx,
color: Colors.black,
),
),
),
),
),
],
),
),
),
),
),
Align(
alignment: AlignmentDirectional(-1, 0),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 32.rpx, 0, 0),
child: Container(
width: double.infinity,
height: bodysize!.maxHeight * 0.06,
decoration: BoxDecoration(
color: Color(0xFFF3F5F6),
borderRadius: BorderRadius.circular(12),
),
constraints: BoxConstraints(
minHeight: 92.rpx,
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
35.rpx, 0, 35.rpx, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Container(
child: Align(
alignment:
AlignmentDirectional(
-1, 0),
child: Obx(() =>
TextFormField(
onChanged: (value) {
controller.model
.register_pd =
value;
},
obscureText: controller
.model.pdshow!,
decoration:
InputDecoration(
isDense: true,
hintText: '请输入密码'.tr,
hintStyle: TextStyle(
fontFamily:
'Readex Pro',
color: Color(
0xFF929699),
fontSize: 26.rpx,
),
border:
InputBorder.none,
suffixIcon:
IconButton(
icon: Icon(
controller.model
.pdshow!
? Icons
.visibility_off
: Icons
.visibility,
color: Color(
0xFF333333),
size: 16,
),
onPressed: () {
controller.model
.pdshow =
!controller
.model
.pdshow!;
controller
.updateAll();
},
),
),
style: TextStyle(
fontFamily:
'Readex Pro',
fontSize: 26.rpx,
color: Colors.black,
),
)),
),
),
),
],
),
),
),
),
),
// 确认密码输入框
Align(
alignment: AlignmentDirectional(-1, 0),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 32.rpx, 0, 0),
child: Container(
width: double.infinity,
height: bodysize!.maxHeight * 0.06,
decoration: BoxDecoration(
color: Color(0xFFF3F5F6),
borderRadius: BorderRadius.circular(12),
),
constraints: BoxConstraints(
minHeight: 92.rpx,
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
35.rpx, 0, 35.rpx, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Container(
child: Align(
alignment:
AlignmentDirectional(
-1, 0),
child: Obx(() =>
TextFormField(
onChanged: (value) {
controller.model
.register_confirm_pd =
value;
},
obscureText: controller
.model.cpdshow!,
decoration:
InputDecoration(
isDense: true,
hintText:
'请输入确认密码'.tr,
hintStyle: TextStyle(
fontFamily:
'Readex Pro',
color: Color(
0xFF929699),
fontSize: 26.rpx,
),
border:
InputBorder.none,
suffixIcon:
IconButton(
icon: Icon(
controller.model
.pdshow!
? Icons
.visibility_off
: Icons
.visibility,
color: Color(
0xFF333333),
size: 16,
),
onPressed: () {
controller.model
.cpdshow =
!controller
.model
.cpdshow!;
controller
.updateAll();
},
),
),
style: TextStyle(
fontFamily:
'Readex Pro',
fontSize: 26.rpx,
color: Colors.black,
),
)),
),
),
),
],
),
),
),
),
),
// 验证码输入框
Align(
alignment: AlignmentDirectional(-1, 0),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 32.rpx, 0, 0),
child: Container(
width: double.infinity,
height: bodysize!.maxHeight * 0.06,
decoration: BoxDecoration(
color: Color(0xFFF3F5F6),
borderRadius: BorderRadius.circular(12),
),
constraints: BoxConstraints(
minHeight: 92.rpx,
),
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
35.rpx, 0, 35.rpx, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Container(
child: Align(
alignment:
AlignmentDirectional(
-1, 0),
child: TextFormField(
onChanged: (value) {
controller.model
.register_code =
value;
},
decoration: InputDecoration(
isDense: true,
hintText: '请输入验证码',
hintStyle: TextStyle(
fontFamily:
'Readex Pro',
color:
Color(0xFF929699),
fontSize: 26.rpx,
),
border: InputBorder.none,
),
style: TextStyle(
fontFamily: 'Readex Pro',
fontSize: 26.rpx,
color: Colors.black,
),
),
),
),
),
Container(
width: 1.rpx,
height: 38.rpx,
color: Color(0xFF929699),
),
Obx(() {
final countdownController = Get
.find<CountdownController>();
return InkWell(
onTap: () async {
if (countdownController
.countdown.value !=
0) return;
String msg = await controller
.getCode(context);
if (msg.isEmpty) {
countdownController
.startCountdown(
AppConstants
.code_time);
}
},
child: Text(
countdownController.countdown
.value ==
0
? '获取验证码'.tr
: '${countdownController.countdown.value}'
.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: Color(0xFF333333),
fontSize: 20.rpx,
),
),
);
}),
],
),
),
),
),
),
// 其他部分保持不变...
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 19, 0, 0),
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 0.022,
constraints: BoxConstraints(
minWidth: 466,
minHeight: 30,
),
decoration: BoxDecoration(),
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 0.022,
constraints: BoxConstraints(
minWidth: 466,
minHeight: 30,
),
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Align(
alignment:
AlignmentDirectional(0, 0),
child: Padding(
padding: EdgeInsetsDirectional
.fromSTEB(0, 3, 0, 0),
child: Container(
width: 36,
height: 36,
decoration: BoxDecoration(),
child: Align(
alignment:
AlignmentDirectional(
0, 0),
child: Theme(
data: ThemeData(
checkboxTheme:
CheckboxThemeData(
visualDensity:
VisualDensity
.compact,
materialTapTargetSize:
MaterialTapTargetSize
.shrinkWrap,
shape:
RoundedRectangleBorder(
borderRadius:
BorderRadius
.circular(
64),
),
),
unselectedWidgetColor:
Color(0xFFD3D3D3),
),
child: Obx(
() => Checkbox(
value: controller
.model
.register_agree ??
false,
onChanged:
(newValue) async {
controller.model
.register_agree =
newValue;
controller
.updateAll();
},
side: BorderSide(
width: 1.5,
color: Colors.white,
),
activeColor:
const Color(
0xFF84F5FF),
checkColor:
Color(0xFF003058),
visualDensity:
VisualDensity(
horizontal:
-4.0,
vertical:
-4.0),
),
)),
),
),
),
),
Flexible(
child: Padding(
padding: EdgeInsetsDirectional
.fromSTEB(0, 0, 0, 0),
child: Container(
width:
MediaQuery.sizeOf(context)
.width *
0.622,
height:
MediaQuery.sizeOf(context)
.height *
1,
constraints: BoxConstraints(
minWidth: 466,
minHeight: 30,
),
decoration: BoxDecoration(),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(),
child: Row(
mainAxisSize:
MainAxisSize.max,
children: [
Align(
alignment:
AlignmentDirectional(
0, 0),
child: Text(
'我已阅读并同意'.tr,
style: TextStyle(
fontFamily:
'Readex Pro',
color: Colors.white,
fontSize: 12,
letterSpacing: 0,
),
),
),
Align(
alignment:
AlignmentDirectional(
0, 0),
child: InkWell(
onTap: () {
showCustomConfirmOfWebViewDialog(
context,
"用户协议",
"/#/pages/agreement/agreement?type=2&hideHead=true");
},
child: Text(
'《用户协议》'.tr,
style: TextStyle(
fontFamily:
'Readex Pro',
color:
stringToColor(
"FF9F66"),
fontSize: 12,
letterSpacing: 0,
),
),
),
),
Align(
alignment:
AlignmentDirectional(
0, 0),
child: Text(
''.tr,
style: TextStyle(
fontFamily:
'Readex Pro',
color: Colors.white,
fontSize: 12,
letterSpacing: 0,
),
),
),
Align(
alignment:
AlignmentDirectional(
0, 0),
child: InkWell(
onTap: () {
showCustomConfirmOfWebViewDialog(
context,
"隐私协议",
"/#/pages/agreement/agreement?type=1&hideHead=true");
},
child: Text(
'《隐私协议》'.tr,
style: TextStyle(
fontFamily:
'Readex Pro',
color:
stringToColor(
"FF9F66"),
fontSize: 12,
letterSpacing: 0,
),
),
),
),
],
),
),
),
),
),
],
),
),
),
),
Padding(
padding: EdgeInsetsDirectional.fromSTEB(
0, 29, 0, 0),
child: Container(
width: bodysize!.maxWidth,
height: bodysize!.maxHeight * 0.056,
decoration: BoxDecoration(),
child: CustomCard(
borderRadius: 16.rpx,
gradientDirection:
GradientDirection.vertical,
onTap: () async {
if (CommonVariables.isNetWorkOn ==
false) {
TopSlideNotification.show(context,
text: "网络未连接,请开启设备网络后重试".tr,
textColor: themeController
.currentColor.sc9);
return;
}
String msg = await controller
.registerUser(context);
if (msg == null || msg.isEmpty) {
Get.toNamed("/loginPage");
}
},
colors: const [
Color(0xFFFCFCFC),
Color(0xFFF8FAF9),
Color(0XFFECF6F3),
Color(0XFFD9F0E9),
Color(0xFFCEECE3)
],
child: Container(
width: double.infinity,
height: 90.rpx,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(16.rpx),
),
child: Text(
"提交".tr,
style: TextStyle(
fontFamily: 'Readex Pro',
color: stringToColor("#011D33"),
letterSpacing: 0,
fontSize: 30.rpx,
),
),
),
)),
),
],
),
),
),
),
),
],
),
),
)),
));
});
}
}