input_text.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  2. import 'package:fis_lib_report/converts/text_size_converter.dart';
  3. import 'package:fis_lib_report/converts/alignment_convert.dart';
  4. import 'package:fis_lib_report/report/inputText.dart';
  5. import 'package:fis_lib_report/report_info/element_info.dart';
  6. import 'package:fis_lib_report/report_info/input_text_info.dart';
  7. import 'package:fis_lib_report/report_info/report_info.dart';
  8. import 'package:flutter/material.dart';
  9. class RInputText extends StatefulWidget {
  10. final InputText inputText;
  11. const RInputText({Key? key, required this.inputText}) : super(key: key);
  12. @override
  13. State<StatefulWidget> createState() {
  14. return _RInputTextState();
  15. }
  16. }
  17. class _RInputTextState extends State<RInputText> {
  18. _RInputTextState();
  19. final _controller = TextEditingController();
  20. final _focusNode = FocusNode();
  21. double? _lineWidth = 136.0;
  22. double? _fontSize = 22.0;
  23. double? _height = 22.0;
  24. bool? _textWrap = false;
  25. Color _fontColor = const Color.fromARGB(255, 0, 0, 0);
  26. Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
  27. int? _lineLength = 1;
  28. TextStyle? _textStyle;
  29. InputTextInfo? _inputTextInfo;
  30. bool _isReadOnly = false;
  31. @override
  32. initState() {
  33. _initDatas();
  34. ReportInfo.instance.onReloadFinsh.addListener((sender, e) {
  35. _initDatas();
  36. });
  37. super.initState();
  38. }
  39. @override
  40. Widget build(BuildContext context) {
  41. final inputTextInfo = ReportInfo.instance.getElementInfo(widget.inputText);
  42. if (_inputTextInfo != inputTextInfo) {
  43. _inputTextInfo = inputTextInfo as InputTextInfo;
  44. }
  45. if (!_inputTextInfo!.isListening!) {
  46. _initDatas();
  47. _inputTextInfo!.isListening = true;
  48. }
  49. try {
  50. if (_inputTextInfo!.text != _controller.text) {
  51. _controller.text = _inputTextInfo!.text!;
  52. if (_inputTextInfo!.isReadOnly! &&
  53. _inputTextInfo!.tag!.name == 'ReportPhysician') {
  54. _controller.text = ReportInfo.instance.reporter ?? '';
  55. }
  56. }
  57. } catch (e) {
  58. print(e);
  59. }
  60. return Container(
  61. //constraints: BoxConstraints(minWidth: _lineWidth!, maxWidth: 480),
  62. width: _lineWidth,
  63. height: _textWrap! ? _height! * 4 : (_height! - 2),
  64. padding: const EdgeInsets.only(right: 5, left: 5),
  65. decoration: BoxDecoration(
  66. border: Border.all(
  67. width: 1,
  68. color: _isReadOnly ? Colors.transparent : Colors.grey,
  69. ),
  70. color: _backgroundColor,
  71. ),
  72. child: TextField(
  73. focusNode: _focusNode,
  74. readOnly: _isReadOnly,
  75. decoration: null,
  76. textAlignVertical: AlignmentConvert.verticalAlignmentConvert(
  77. widget.inputText.verticalAlignment),
  78. minLines: 1,
  79. maxLines: _textWrap! ? 6 : 1,
  80. controller: _controller,
  81. textAlign: TextAlign.start,
  82. style: _textStyle,
  83. onChanged: (v) {
  84. // _onInputChanged(_textStyle!, v);
  85. },
  86. onEditingComplete: () {
  87. _onInputChanged(_textStyle!, _controller.text);
  88. }),
  89. );
  90. }
  91. //onchange 事件
  92. void _onInputChanged(TextStyle _textStyle, String value) {
  93. final inputText = widget.inputText;
  94. if (_inputTextInfo != null) {
  95. _inputTextInfo!.text = value;
  96. }
  97. final width = TextSizeConvert.getTextSize(value, _textStyle).width + 15;
  98. //TODO(LOki):此处需要区分不同的输入框
  99. if (inputText.tag!.name == 'HospitalName') {
  100. if (_lineWidth! < width) {
  101. setState(() {
  102. if (width < 480) {
  103. _lineWidth = width;
  104. }
  105. });
  106. } else if (_controller.text.isEmpty) {
  107. setState(() {
  108. //重置长度
  109. _lineWidth = inputText.lineWidth;
  110. });
  111. } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle)
  112. .width >
  113. inputText.lineWidth!) {
  114. setState(() {
  115. if (width < 480) {
  116. _lineWidth = width;
  117. }
  118. });
  119. }
  120. }
  121. }
  122. @override
  123. void dispose() {
  124. _controller.dispose();
  125. super.dispose();
  126. }
  127. void _initDatas() {
  128. _controller.text = '';
  129. _focusNode.addListener(() {
  130. if (!_focusNode.hasFocus) {
  131. _onInputChanged(_textStyle!, _controller.text);
  132. }
  133. });
  134. final inputText = widget.inputText;
  135. _isReadOnly = inputText.isReadOnly!;
  136. final inputTextInfo = ReportInfo.instance.getElementInfo(inputText);
  137. _inputTextInfo = inputTextInfo as InputTextInfo;
  138. if (_inputTextInfo!.isReadOnly!) {
  139. if (_inputTextInfo!.tag!.name == 'ReportPhysician') {
  140. _controller.text = ReportInfo.instance.reporter ?? '';
  141. }
  142. }
  143. final fontColor = inputText.fontColor;
  144. if (fontColor != null) {
  145. _fontColor = Color.fromARGB(
  146. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
  147. }
  148. final backgroundColor = inputText.background;
  149. if (backgroundColor != null) {
  150. _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
  151. backgroundColor.g!, backgroundColor.b!);
  152. }
  153. _textStyle = TextStyle(
  154. fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
  155. color: _fontColor,
  156. );
  157. //TODO(Loki):set FontName in TextField
  158. final fontName = inputText.fontName;
  159. //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
  160. final fontStyles = inputText.fontStyles;
  161. _lineLength = inputText.lineLength;
  162. _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
  163. _textWrap = inputText.textWrap;
  164. _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
  165. _height = _fontSize! > 30 ? 41 : 22;
  166. ReportInfo.instance.onReloadFinsh.addListener((sender, e) {
  167. _initDatas();
  168. });
  169. setState(() {});
  170. }
  171. }