Files
tuiche/lib/pages/mh_page/people_info.dart
2025-06-11 08:47:06 +08:00

773 lines
43 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:async';
import 'package:ef/base/widget/flutterflow/FlutterFlowTheme.dart';
import 'package:ef/ef.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutterflow_ui/flutterflow_ui.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/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/mh_controller/people_info_controller.dart';
import 'package:vbvs_app/pages/common/selectDialog.dart';
class PeopleInfoPage extends StatefulWidget {
const PeopleInfoPage({super.key});
@override
State<PeopleInfoPage> createState() => _PeopleInfoState();
}
class _PeopleInfoState extends State<PeopleInfoPage> {
get controller => Get.find<PeopleInfoController>();
get glcontroller => Get.find<GlobalController>();
// @override
// void initState() {
// super.initState();
// Timer(const Duration(milliseconds: 100), () {
// controller.getPeoples();
// });
// }
getLine() {
return Container(height: 0.5.rpx, color: Color(0xFFD8D8D8));
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, boxConstraints) => GestureDetector(
// onTap: () => FocusScope.of(context).unfocus(),
onTap: () {
// 触摸收起键盘
FocusScope.of(context).requestFocus(FocusNode());
},
child: Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/new_background.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: AppBar(
backgroundColor: Colors.transparent,
automaticallyImplyLeading: false,
iconTheme: IconThemeData(color: Colors.white),
titleSpacing: 0,
title: AppBar(
backgroundColor: Colors.transparent,
iconTheme: const IconThemeData(color: Colors.white),
automaticallyImplyLeading: false,
titleSpacing: 0,
title: SizedBox(
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,
),
Positioned(
right: 30.rpx,
child: CustomCard(
borderRadius: 16.rpx,
gradientDirection: GradientDirection.vertical,
onTap: () {
// bool isOk = true;
// for (var i = 0; i < 2; i++) {
// var d = controller.model.peopleList[i];
// print("${d.toJson()}");
// String before = "人员信息${i == 0 ? "A" : "B"}";
// if (isOk &&
// d.height != null &&
// d.height != "" &&
// int.tryParse("${d.height}") == null) {
// showToast("$before身高请输入数字");
// isOk = false;
// }
// if (isOk &&
// d.weight != null &&
// d.weight != "" &&
// int.tryParse("${d.weight}") == null) {
// showToast("$before体重请输入数字");
// isOk = false;
// }
// if (isOk &&
// d.tel != null &&
// d.tel != "" &&
// MyUtils.isValidPhoneNumber("${d.tel}") ==
// false) {
// showToast("$before请输入正确的电话");
// isOk = false;
// }
// if (isOk &&
// d.emergencyContact != null &&
// d.emergencyContact != "" &&
// MyUtils.isValidPhoneNumber(
// "${d.emergencyContact}") ==
// false) {
// showToast("$before请输入正确的紧急联系人电话");
// isOk = false;
// }
// if (isOk) {
// controller.savePeoples().then((d) {
// showToast("保存成功", color: color_success);
// }).catchError((d) {
// print("$d");
// showToast("保存失败");
// });
// }
// }
// controller.model.peopleList.forEach((d) {});
},
colors: const [
Color(0xFFFCFCFC),
Color(0xFFF8FAF9),
Color(0XFFECF6F3),
Color(0XFFD9F0E9),
Color(0xFFCEECE3)
],
child: Container(
width: 120.rpx,
height: 60.rpx,
alignment: Alignment.center,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(5),
// color: stringToColor("#182B7C"),
// ),
child: Text(
"保存",
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0XFF011D33),
letterSpacing: 0,
fontSize: 30.rpx,
),
),
),
))
],
),
),
actions: [],
centerTitle: false,
),
centerTitle: false,
),
body: SafeArea(
top: true,
child: Container(
padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx),
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height * 1.123,
// decoration: BoxDecoration(
// color: Colors.transparent,
// image: DecorationImage(
// image: AssetImage("assets/images/background.png"),
// fit: BoxFit.cover,
// ),
// ),
child: SingleChildScrollView(
child: Column(
children: [
...List.generate(
"${glcontroller.model.deviceMain["bindMacB"]}"
.length >
6
? 2
: 1, (index) {
String location_ = "";
if ("${glcontroller.model.deviceMain["bindMacB"]}"
.length >
6 &&
(glcontroller.model.mainDevicePeople[0]
?["direction"] ==
1 ||
glcontroller.model.mainDevicePeople[1]
?["direction"] ==
1)) {
location_ =
"${glcontroller.model.mainDevicePeople[index]?["direction"] == 1 ? '左侧' : '右侧'}";
}
return Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.only(
top: index == 0 ? 30.rpx : 90.rpx,
bottom: 20.rpx),
child: Text(
"人员信息${index == 0 ? "A" : "B"}",
style: TextStyle(
color: Colors.white, fontSize: 30.rpx),
),
),
Container(
padding:
EdgeInsets.only(left: 30.rpx, right: 30.rpx),
child: Column(
children: [
if (location_.isNotEmpty)
Container(
width: double.infinity,
height:
MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'校准位置',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
Text(
'$location_',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
],
),
),
getLine(),
Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'姓名',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
Container(
width: 300.rpx,
child: TextField(
obscureText: false,
textAlign: TextAlign.right,
style: TextStyle(
fontSize: 30.rpx,
color: Colors.white),
decoration: const InputDecoration(
fillColor: Colors.transparent,
filled: true,
hintText: "请输入姓名",
hintStyle: TextStyle(
color: Colors.white),
border: InputBorder.none,
contentPadding:
EdgeInsets.all(0)),
onChanged: (value) {
controller.model.peopleList[index]
.name = value;
controller.updateAll();
},
controller: controller.onReDraw(
TextEditingController(
text: controller
.model
.peopleList[index]
.name ??
""),
(textEditingController) {
textEditingController.text =
controller
.model
.peopleList[index]
.name ??
"";
}, "people_name_$index"),
),
),
],
),
),
getLine(),
Obx(
() => Container(
width: double.infinity,
height:
MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'性别',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
InkWell(
onTap: () {
// 触摸收起键盘
FocusScope.of(context)
.requestFocus(FocusNode());
Future.delayed(
const Duration(
milliseconds: 250), () {
// 延迟执行的代码
showOneSelectionDialog(context,
arr: ["", ""],
checkIndex: controller
.model
.peopleList[
index]
.sex ==
""
? 0
: 1,
checkChange: (sindex) {
controller
.model
.peopleList[index]
.sex =
(sindex == 0 ? '' : '');
controller.updateAll();
print("sex $sindex");
}).then((d) {
// Timer(Duration.zero, () {
// FocusScope.of(context).unfocus();
// });
});
});
},
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Container(
width: 200.rpx,
child: Text(
'${controller.model.peopleList[index].sex}',
textAlign: TextAlign.right,
style: FlutterFlowTheme.of(
context)
.bodyMedium
.override(
fontFamily:
'Readex Pro',
color: Colors.white,
fontSize: 30.rpx,
letterSpacing: 0,
),
),
),
SizedBox(
width: 16.rpx,
),
Icon(
Icons.expand_more,
color: Colors.white,
size: 48.rpx,
),
],
),
),
],
),
),
),
getLine(),
Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'身高(cm)',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
InkWell(
onTap: () {
FocusScope.of(context).unfocus();
Future.delayed(
const Duration(
milliseconds: 250), () {
showHeightPickerDialog(
context,
initialHeight: controller
.model
.peopleList[index]
.height ??
170,
onConfirm:
(int selectedHeight) {
controller
.model
.peopleList[index]
.height =
selectedHeight.toString();
controller.updateAll();
print(
"身高: $selectedHeight cm");
},
);
});
},
child: Row(
children: [
Text(
controller
.model
.peopleList[index]
.height !=
null
? "${controller.model.peopleList[index].height} cm"
: '',
style:
FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
'Readex Pro',
color: Colors.white,
fontSize: 30.rpx,
),
),
SizedBox(width: 16.rpx),
Icon(Icons.expand_more,
color: Colors.white,
size: 48.rpx),
],
),
),
],
),
),
getLine(),
Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'体重(kg)',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
InkWell(
onTap: () {
FocusScope.of(context).unfocus();
Future.delayed(
const Duration(
milliseconds: 250), () {
showWeightPickerDialog(
context,
initialWeight: controller
.model
.peopleList[index]
.weight ??
"",
onConfirm:
(int selectedWeight) {
controller
.model
.peopleList[index]
.weight =
selectedWeight
.toString(); // ✅ 转成字符串
controller.updateAll();
print(
"体重: $selectedWeight kg");
},
);
});
},
child: Row(
children: [
Text(
controller
.model
.peopleList[index]
.weight !=
null
? "${controller.model.peopleList[index].weight} kg"
: '',
style:
FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
'Readex Pro',
color: Colors.white,
fontSize: 30.rpx,
),
),
SizedBox(width: 16.rpx),
Icon(Icons.expand_more,
color: Colors.white,
size: 48.rpx),
],
),
),
],
),
),
getLine(),
Obx(
() => Container(
width: double.infinity,
height:
MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'生日',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
InkWell(
onTap: () {
// 触摸收起键盘
FocusScope.of(context)
.requestFocus(FocusNode());
Future.delayed(
const Duration(
milliseconds: 250), () {
// 延迟执行的代码
showDateSelectionDialog(context,
checkDate: controller
.model
.peopleList[index]
.birthday ??
DateTime.now(),
checkChange: (DateTime d) {
controller
.model
.peopleList[index]
.birthday = d;
controller.updateAll();
print("$d");
}).then((d) {
// Timer(Duration.zero, () {
// FocusScope.of(context).unfocus();
// });
});
});
},
child: Row(
mainAxisSize: MainAxisSize.max,
children: [
Container(
constraints: BoxConstraints(
minWidth: 200.rpx),
child: Text(
controller
.model
.peopleList[
index]
.birthday !=
null
? DateFormat(
"yyyy年MM月dd日")
.format(controller
.model
.peopleList[
index]
.birthday!)
: '',
textAlign: TextAlign.right,
style: FlutterFlowTheme.of(
context)
.bodyMedium
.override(
fontFamily:
'Readex Pro',
color: Colors.white,
fontSize: 30.rpx,
letterSpacing: 0,
),
),
),
SizedBox(
width: 16.rpx,
),
Icon(
Icons.expand_more,
color: Colors.white,
size: 48.rpx,
),
],
),
),
],
),
),
),
getLine(),
Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height *
0.064,
decoration: BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'联系人',
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Readex Pro',
color: Color(0xFF9EA4B7),
fontSize: 30.rpx,
letterSpacing: 0,
),
),
Container(
width: 300.rpx,
child: TextField(
obscureText: false,
keyboardType: TextInputType.number,
textInputAction:
TextInputAction.done,
textAlign: TextAlign.right,
style: TextStyle(
fontSize: 30.rpx,
color: Colors.white),
decoration: InputDecoration(
fillColor: Colors.transparent,
filled: true,
hintText: "请输入联系人",
hintStyle: TextStyle(
color: Colors.white),
border: InputBorder.none,
contentPadding:
EdgeInsets.all(0)),
onChanged: (value) {
controller.model.peopleList[index]
.emergencyContact = value;
controller.updateAll();
},
controller: controller.onReDraw(
TextEditingController(
text: controller
.model
.peopleList[index]
.emergencyContact ??
""),
(textEditingController) {
textEditingController.text =
controller
.model
.peopleList[index]
.emergencyContact ??
"";
}, "people_emergencyContact_$index"),
),
),
],
),
),
getLine(),
],
),
)
],
);
}),
SizedBox(
height: 100.rpx,
),
],
)),
),
),
),
)),
);
}
}