import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/app_uri_status.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/base/THFlutterFlowDropDown.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/device/body_device_controller.dart'; import 'package:vbvs_app/controller/mh_controller/apply_repair_controller.dart'; import 'package:vbvs_app/controller/repair/repair_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/model/api_response.dart'; class RepairModelWidget extends StatefulWidget { var model; final VoidCallback onTap; // 添加回调函数 int length; final GlobalKey widgetKey; // 新增 final bool showDelete; // ✅ 新增 RepairModelWidget({ super.key, required this.model, required this.onTap, required this.length, required this.widgetKey, this.showDelete = true, // ✅ 默认为 false }); @override State createState() => _RepairModelWidgetState(); } class _RepairModelWidgetState extends State { FormFieldController _deviceController = FormFieldController(null); ApplyRepairController applyRepairController = Get.find(); RepairController repairController = Get.find(); UserInfoController userInfoController = Get.find(); late FormFieldController? _issueController; BodyDeviceController bodyDeviceController = Get.find(); @override void setState(VoidCallback callback) { super.setState(callback); } @override void initState() { super.initState(); _issueController = FormFieldController(widget.model['issue'] ?? ''); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Container( key: widget.widgetKey, // 使用传入的 key width: double.infinity, decoration: BoxDecoration( color: themeController.currentColor.sc5, borderRadius: BorderRadius.circular(AppConstants().normal_container_radius), ), child: Padding( padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 35.rpx, 30.rpx, 35.rpx), child: Container( width: double.infinity, decoration: BoxDecoration(), child: Column( mainAxisSize: MainAxisSize.max, children: [ Container( width: double.infinity, decoration: BoxDecoration(), child: Row( mainAxisSize: MainAxisSize.max, children: [ Container( width: 110.rpx, decoration: BoxDecoration(), child: Text( '设备ID'.tr, style: TextStyle( fontSize: 26.rpx, color: themeController.currentColor.sc3, ), ), ), Expanded( child: Container( decoration: BoxDecoration( color: themeController.currentColor.sc15, borderRadius: BorderRadius.circular( AppConstants().normal_container_radius), ), height: AppConstants().dropdown_height, child: THFlutterFlowDropDown( controller: _issueController, onChanged: (val) { widget.model['id'] = val; final targetId = widget.model['id']; final matchedDevice = bodyDeviceController.deviceList.firstWhere( (device) => device['_id'] == targetId, orElse: () => null, // 如果找不到,返回 null(可选) ); if (matchedDevice != null) { // 找到了匹配的项 // widget.model['param'] = matchedDevice['mac']; widget.model['mac'] = matchedDevice['mac']; widget.model['code'] = matchedDevice['code'] ?? ''; widget.model['name'] = (matchedDevice['person'] ?['name'] ?.toString() .trim() .isNotEmpty ?? false) ? matchedDevice['person']['name'] : '未命名'.tr; repairController.updateAll(); } }, width: 200.rpx, height: 40.rpx, textStyle: TextStyle( color: themeController.currentColor.sc3, fontSize: AppConstants().normal_text_fontSize, ), hintText: '选择设备'.tr, hintTextStyle: TextStyle( color: themeController.currentColor.sc4, fontSize: AppConstants().normal_text_fontSize, ), icon: Icon( Icons.keyboard_arrow_down_rounded, color: Colors.white, size: 24.rpx, ), fillColor: themeController.currentColor.sc15, elevation: 0, borderColor: Colors.transparent, borderWidth: 0, borderRadius: 20.rpx, margin: EdgeInsetsDirectional.fromSTEB( 20.rpx, 0, 20.rpx, 0), hidesUnderline: true, isOverButton: false, isSearchable: false, isMultiSelect: false, // controller: _deviceController, options: repairController.deviceListId!, optionLabels: repairController.deviceListIdLabel!, ), ), ), ].divide(SizedBox(width: 24.rpx)), ), ), Container( width: double.infinity, decoration: BoxDecoration(), child: Row( mainAxisSize: MainAxisSize.max, children: [ Container( width: 110.rpx, decoration: BoxDecoration(), child: Text( '设备参数'.tr, style: TextStyle( fontSize: 26.rpx, color: themeController.currentColor.sc3, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), ), Obx(() { return Expanded( child: Container( width: 200.rpx, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10.rpx), color: Colors.transparent, ), child: TextFormField( controller: repairController.onReDraw( TextEditingController( text: widget.model['param']), (textEditingController) { textEditingController.text = widget.model['param']; }), // initialValue: widget.model['param'], autofocus: false, obscureText: false, decoration: InputDecoration( isDense: true, labelStyle: TextStyle( letterSpacing: 0.0, ), hintText: "设备参数提示".tr, hintStyle: TextStyle( letterSpacing: 0.0, fontSize: AppConstants().normal_text_fontSize, color: themeController.currentColor.sc4, ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: Color(0x00000000), width: 1.rpx, ), borderRadius: BorderRadius.circular( AppConstants().normal_container_radius), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( color: Colors.transparent, width: 1.rpx, ), borderRadius: BorderRadius.circular(8.rpx), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( // width: 1.rpx, ), borderRadius: BorderRadius.circular(8.rpx), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( // width: 1.rpx, ), borderRadius: BorderRadius.circular(8.rpx), ), filled: true, fillColor: themeController.currentColor.sc15, ), style: TextStyle( letterSpacing: 0.0, color: themeController.currentColor.sc3, fontSize: AppConstants().normal_text_fontSize, ), cursorColor: themeController.currentColor.sc3, onChanged: (value) { widget.model['param'] = value; }, ), ), ); }), ].divide(SizedBox(width: 24.rpx)), ), ), // Container( // width: double.infinity, // // height: 151.rpx, // height: 200.rpx, // decoration: BoxDecoration( // color: themeController.currentColor.sc15, // borderRadius: BorderRadius.circular(20.rpx), // ), // child: Container( // width: 200.rpx, // child: TextFormField( // controller: repairController.onReDraw( // TextEditingController(text: widget.model['issue']), // (textEditingController) { // textEditingController.text = widget.model['issue']; // }), // onChanged: (value) { // widget.model['issue'] = value; // }, // maxLines: null, // 👈 支持无限行 // // controller: TextEditingController(), // autofocus: false, // obscureText: false, // maxLength: 60, // decoration: InputDecoration( // isDense: true, // labelStyle: TextStyle( // letterSpacing: 0.0, // ), // hintText: '问题描述'.tr, // hintStyle: TextStyle( // fontSize: 26.rpx, // letterSpacing: 0.0, // color: themeController.currentColor.sc4, // ), // enabledBorder: OutlineInputBorder( // borderSide: BorderSide( // color: Color(0x00000000), // width: 1, // ), // borderRadius: BorderRadius.circular(8.rpx), // ), // focusedBorder: OutlineInputBorder( // borderSide: BorderSide( // color: Color(0x00000000), // width: 1, // ), // borderRadius: BorderRadius.circular(8.rpx), // ), // errorBorder: OutlineInputBorder( // borderSide: BorderSide( // // // width: 1, // ), // borderRadius: BorderRadius.circular(8.rpx), // ), // focusedErrorBorder: OutlineInputBorder( // borderSide: BorderSide( // // // width: 1, // ), // borderRadius: BorderRadius.circular(8.rpx), // ), // filled: false, // contentPadding: EdgeInsets.symmetric( // vertical: 20.rpx, horizontal: 20.rpx), // ), // style: TextStyle( // color: themeController.currentColor.sc3, // fontSize: AppConstants().normal_text_fontSize, // ), // cursorColor: themeController.currentColor.sc3, // ), // ), // ), Container( width: double.infinity, height: 170.rpx, decoration: BoxDecoration( color: themeController.currentColor.sc15, borderRadius: BorderRadius.circular(20.rpx), ), child: Padding( // 👇 给输入框整体加点内边距 padding: EdgeInsets.only(bottom: 10.rpx, right: 10.rpx), child: TextFormField( controller: repairController.onReDraw( TextEditingController(text: widget.model['issue']), (textEditingController) { textEditingController.text = widget.model['issue']; }, ), onChanged: (value) { widget.model['issue'] = value; }, maxLines: null, autofocus: false, obscureText: false, maxLength: 60, decoration: InputDecoration( isDense: true, hintText: '问题描述'.tr, hintStyle: TextStyle( fontSize: 26.rpx, letterSpacing: 0.0, color: themeController.currentColor.sc4, ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.transparent, width: 1), borderRadius: BorderRadius.circular(8.rpx), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.transparent, width: 1), borderRadius: BorderRadius.circular(8.rpx), ), filled: false, // 👇 调整输入区域与计数器的间距 contentPadding: EdgeInsets.fromLTRB(20.rpx, 20.rpx, 20.rpx, 40.rpx), // 👇 调整计数器样式和位置(上浮一点,不贴边) counterStyle: TextStyle( height: 1.2, // 控制计数器与下边的距离 fontSize: 22.rpx, color: themeController.currentColor.sc4, ), alignLabelWithHint: true, ), style: TextStyle( color: themeController.currentColor.sc3, fontSize: AppConstants().normal_text_fontSize, ), cursorColor: themeController.currentColor.sc3, ), ), ), ClickableContainer( backgroundColor: themeController.currentColor.sc15, highlightColor: themeController.currentColor.sc21, borderRadius: 20.rpx, padding: EdgeInsets.zero, onTap: () async { ApiResponse apiResponse = await applyRepairController.uploadImg(); print(apiResponse); if (apiResponse.code == HttpStatusCodes.ok) { print(widget.model); // setState(() { // widget.model['path'] = apiResponse.data['path']; // }); widget.model['path'] = apiResponse.data['path']; repairController.repairList .refresh(); // 通知 Obx 更新(如果用了 GetX) print(widget.model); } else { if (widget.model['path'] == null || widget.model['path'].isEmpty) { TopSlideNotification.show( context, text: apiResponse.msg!, textColor: apiResponse.code == HttpStatusCodes.ok ? themeController.currentColor.sc2 : themeController.currentColor.sc9, ); } } }, child: SizedBox( width: double.infinity, height: MediaQuery.sizeOf(context).height * 0.203, child: ConstrainedBox( constraints: BoxConstraints( minHeight: 151.rpx, ), child: Obx(() { var list = repairController.repairList; print(list); if (widget.model['path'] == null || widget.model['path'] == "") { return Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 60.rpx, height: 53.rpx, child: SvgPicture.asset( 'assets/img/icon/camera.svg', width: 24.rpx, height: 24.rpx, color: themeController.currentColor.sc4, ), ), Text( '上传提示'.tr, style: TextStyle( fontSize: 26.rpx, letterSpacing: 0.0, color: themeController.currentColor.sc4, ), ), ].divide(SizedBox(height: 28.rpx)), ); } return Container( // clipBehavior: Clip.antiAlias, child: Image.network( widget.model['path'], fit: BoxFit.cover, ), ); })), ), ), if (widget.length > 1 && widget.showDelete == true) Padding( padding: EdgeInsetsDirectional.fromSTEB( 100.rpx, 0.rpx, 100.rpx, 0.rpx), child: CustomCard( borderRadius: AppConstants().button_container_radius, // 圆角半径 onTap: widget.onTap, colors: [ Colors.transparent, ], child: Container( decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular( AppConstants().button_container_radius), ), width: MediaQuery.sizeOf(context).width * 0.216, height: MediaQuery.sizeOf(context).height * 0.038, constraints: BoxConstraints( minHeight: 62.rpx, ), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '删除'.tr, style: TextStyle( color: themeController.currentColor.sc9, fontFamily: 'Inter', fontSize: AppConstants().normal_text_fontSize, letterSpacing: 0.0, ), ), ].divide(SizedBox( width: 17.rpx, )), ), ), ), ), ].divide(SizedBox(height: 29.rpx)), ), ), ), ); } }