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/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 createState() { return _RInputTextState(); } } class _RInputTextState extends State { _RInputTextState(); 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; String _text = ''; @override initState() { ReportInfo.instance.onReloadFinsh.addListener((sender, e) { _initDatas(); }); super.initState(); } @override Widget build(BuildContext context) { final inputTextInfo = ReportInfo.instance.getElementInfo(widget.inputText); if (_inputTextInfo != inputTextInfo) { if (_inputTextInfo != null) _inputTextInfo!.onTextChange.dispose(); _inputTextInfo = inputTextInfo as InputTextInfo; } if (!_inputTextInfo!.isListening!) { _initDatas(); _inputTextInfo!.isListening = true; } try { if (_inputTextInfo!.text != _controller.text) { _controller.text = _inputTextInfo!.text; if (_inputTextInfo!.isReadOnly! && _inputTextInfo!.tag!.name == 'ReportPhysician') { _controller.text = ReportInfo.instance.reporter ?? ''; } } } catch (e) { print(e); } return Container( //constraints: BoxConstraints(minWidth: _lineWidth!, maxWidth: 480), width: _lineWidth, height: _textWrap! ? _height! * 4 : (_height! - 2), 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( widget.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) { final inputText = widget.inputText; if (_inputTextInfo != null) { _inputTextInfo!.text = value; } _syncWidth( inputText, value, ); } @override void dispose() { _inputTextInfo!.onTextChange.dispose(); _controller.dispose(); super.dispose(); } void _initDatas() { final inputText = widget.inputText; _textStyle = TextStyle( fontSize: PtToPxConverter.ptToPx(inputText.fontSize), color: _fontColor, ); _controller.text = ''; _focusNode.addListener(() { if (!_focusNode.hasFocus) { _onInputChanged(_textStyle!, _controller.text); } }); _isReadOnly = inputText.isReadOnly!; final inputTextInfo = ReportInfo.instance.getElementInfo(inputText); _inputTextInfo = inputTextInfo as InputTextInfo; _inputTextInfo!.onTextChange.addListener((sender, e) { setState(() { _controller.text = e; _syncWidth( inputText, e, ); }); }); if (_inputTextInfo!.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!); } //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 ? 41 : 22; ReportInfo.instance.onReloadFinsh.addListener((sender, e) { _initDatas(); }); setState(() {}); } void _syncWidth(InputText inputText, String value) { final width = TextSizeConvert.getTextSize(value, _textStyle!).width + 15; 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; } }); } } } }