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/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/repair/repair_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/model/api_response.dart'; import 'package:vbvs_app/routers/routers.dart'; class RepairModelWidget extends StatefulWidget { var model; final VoidCallback onTap; // 添加回调函数 int length; final GlobalKey widgetKey; // 新增 RepairModelWidget({ super.key, required this.model, required this.onTap, required this.length, required this.widgetKey, }); @override State createState() => _RepairModelWidgetState(); } class _RepairModelWidgetState extends State { FormFieldController _deviceController = FormFieldController(null); RepairController repairController = Get.find(); UserInfoController userInfoController = Get.find(); @override void setState(VoidCallback callback) { super.setState(callback); } @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { // _deviceController.value = ""; 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( onChanged: (val) { widget.model['id'] = val; }, 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: FlutterFlowTheme.of(context).secondaryText, 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.deviceListId!, ), ), ), ].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, ), ), 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, fontWeight: FlutterFlowTheme.of(context) .labelMedium .fontWeight, fontStyle: FlutterFlowTheme.of(context) .labelMedium .fontStyle, ), 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( color: FlutterFlowTheme.of(context).error, width: 1.rpx, ), borderRadius: BorderRadius.circular(8.rpx), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of(context).error, 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, decoration: BoxDecoration( color: themeController.currentColor.sc15, borderRadius: BorderRadius.circular(20.rpx), ), child: Container( width: 200.rpx, child: TextFormField( onChanged: (value) { widget.model['issue'] = value; }, maxLines: null, // 👈 支持无限行 controller: TextEditingController(), autofocus: false, obscureText: false, decoration: InputDecoration( isDense: true, labelStyle: TextStyle( letterSpacing: 0.0, fontWeight: FlutterFlowTheme.of(context).labelMedium.fontWeight, fontStyle: FlutterFlowTheme.of(context).labelMedium.fontStyle, ), 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( color: FlutterFlowTheme.of(context).error, width: 1, ), borderRadius: BorderRadius.circular(8.rpx), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of(context).error, 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, ), ), ), ClickableContainer( backgroundColor: themeController.currentColor.sc15, highlightColor: themeController.currentColor.sc21, borderRadius: 20.rpx, padding: EdgeInsets.zero, onTap: () async { ApiResponse apiResponse = await repairController.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) 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: FlutterFlowTheme.of(context) .bodyMedium .override( color: themeController.currentColor.sc9, fontFamily: 'Inter', fontSize: AppConstants().normal_text_fontSize, letterSpacing: 0.0, ), ), ].divide(SizedBox( width: 17.rpx, )), ), ), ), ), ].divide(SizedBox(height: 29.rpx)), ), ), ), ); } }