import 'package:fis_lib_report/converts/pt_to_px_converter.dart'; import 'package:fis_lib_report/converts/text_size_converter.dart'; import 'package:fis_lib_report/converts/alignment_convert.dart'; import 'package:fis_lib_report/report/inputText.dart'; import 'package:fis_lib_report/report_info/element_info.dart'; import 'package:fis_lib_report/report_info/input_text_info.dart'; import 'package:fis_lib_report/report_info/report_info.dart'; import 'package:flutter/material.dart'; class RInputText extends StatefulWidget { final InputText inputText; const RInputText({Key? key, required this.inputText}) : super(key: key); @override State<StatefulWidget> createState() { return _RInputTextState(); } } class _RInputTextState extends State<RInputText> { _RInputTextState(); late final InputText inputText; final _controller = TextEditingController(); final _focusNode = FocusNode(); double? _lineWidth = 136.0; double? _fontSize = 22.0; double? _height = 22.0; bool? _textWrap = false; Color _fontColor = const Color.fromARGB(255, 0, 0, 0); Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255); int? _lineLength = 1; TextStyle? _textStyle; InputTextInfo? _inputTextInfo; bool _isReadOnly = false; @override initState() { inputText = widget.inputText; _isReadOnly = inputText.isReadOnly!; final inputTextInfo = ReportInfo.instance.getElementInfo(inputText); _inputTextInfo = inputTextInfo as InputTextInfo; if (inputText.isReadOnly!) { if (_inputTextInfo!.tag!.name == 'ReportPhysician') { _controller.text = ReportInfo.instance.reporter ?? ''; } } final fontColor = inputText.fontColor; if (fontColor != null) { _fontColor = Color.fromARGB( fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!); } final backgroundColor = inputText.background; if (backgroundColor != null) { _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!, backgroundColor.g!, backgroundColor.b!); } _textStyle = TextStyle( fontSize: PtToPxConverter.ptToPx(inputText.fontSize), color: _fontColor, ); //TODO(Loki):set FontName in TextField final fontName = inputText.fontName; //TODO(Loki):常规模板暂未设置fontStyles,后续再支持 final fontStyles = inputText.fontStyles; _lineLength = inputText.lineLength; _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth); _textWrap = inputText.textWrap; _fontSize = PtToPxConverter.ptToPx(inputText.fontSize); _height = _fontSize! > 30 ? 43 : 22; _focusNode.addListener(() { if (!_focusNode.hasFocus) { _onInputChanged(_textStyle!, _controller.text); } }); super.initState(); } @override Widget build(BuildContext context) { return Container( //constraints: BoxConstraints(minWidth: _lineWidth!, maxWidth: 480), width: _lineWidth, height: _textWrap! ? _height! * 4 : (_height!), padding: const EdgeInsets.only(right: 5, left: 5), decoration: BoxDecoration( border: Border.all( width: 1, color: _isReadOnly ? Colors.transparent : Colors.grey, ), color: _backgroundColor, ), child: TextField( focusNode: _focusNode, readOnly: _isReadOnly, decoration: null, textAlignVertical: AlignmentConvert.verticalAlignmentConvert( inputText.verticalAlignment), minLines: 1, maxLines: _textWrap! ? 6 : 1, controller: _controller, textAlign: TextAlign.start, style: _textStyle, onChanged: (v) { // _onInputChanged(_textStyle!, v); }, onEditingComplete: () { _onInputChanged(_textStyle!, _controller.text); }), ); } //onchange 事件 void _onInputChanged(TextStyle _textStyle, String value) { if (_inputTextInfo != null) { _inputTextInfo!.text = value; } final width = TextSizeConvert.getTextSize(value, _textStyle).width + 15; //TODO(LOki):此处需要区分不同的输入框 if (inputText.tag!.name == 'HospitalName') { if (_lineWidth! < width) { setState(() { if (width < 480) { _lineWidth = width; } }); } else if (_controller.text.isEmpty) { setState(() { //重置长度 _lineWidth = inputText.lineWidth; }); } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle) .width > inputText.lineWidth!) { setState(() { if (width < 480) { _lineWidth = width; } }); } } } @override void dispose() { _controller.dispose(); super.dispose(); } }