input_text.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. if (_inputTextInfo!.text != _controller.text) {
  50. _controller.text = _inputTextInfo!.text!;
  51. }
  52. return Container(
  53. //constraints: BoxConstraints(minWidth: _lineWidth!, maxWidth: 480),
  54. width: _lineWidth,
  55. height: _textWrap! ? _height! * 4 : (_height! - 2),
  56. padding: const EdgeInsets.only(right: 5, left: 5),
  57. decoration: BoxDecoration(
  58. border: Border.all(
  59. width: 1,
  60. color: _isReadOnly ? Colors.transparent : Colors.grey,
  61. ),
  62. color: _backgroundColor,
  63. ),
  64. child: TextField(
  65. focusNode: _focusNode,
  66. readOnly: _isReadOnly,
  67. decoration: null,
  68. textAlignVertical: AlignmentConvert.verticalAlignmentConvert(
  69. widget.inputText.verticalAlignment),
  70. minLines: 1,
  71. maxLines: _textWrap! ? 6 : 1,
  72. controller: _controller,
  73. textAlign: TextAlign.start,
  74. style: _textStyle,
  75. onChanged: (v) {
  76. // _onInputChanged(_textStyle!, v);
  77. },
  78. onEditingComplete: () {
  79. _onInputChanged(_textStyle!, _controller.text);
  80. }),
  81. );
  82. }
  83. //onchange 事件
  84. void _onInputChanged(TextStyle _textStyle, String value) {
  85. final inputText = widget.inputText;
  86. if (_inputTextInfo != null) {
  87. _inputTextInfo!.text = value;
  88. }
  89. final width = TextSizeConvert.getTextSize(value, _textStyle).width + 15;
  90. //TODO(LOki):此处需要区分不同的输入框
  91. if (inputText.tag!.name == 'HospitalName') {
  92. if (_lineWidth! < width) {
  93. setState(() {
  94. if (width < 480) {
  95. _lineWidth = width;
  96. }
  97. });
  98. } else if (_controller.text.isEmpty) {
  99. setState(() {
  100. //重置长度
  101. _lineWidth = inputText.lineWidth;
  102. });
  103. } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle)
  104. .width >
  105. inputText.lineWidth!) {
  106. setState(() {
  107. if (width < 480) {
  108. _lineWidth = width;
  109. }
  110. });
  111. }
  112. }
  113. }
  114. @override
  115. void dispose() {
  116. _controller.dispose();
  117. super.dispose();
  118. }
  119. void _initDatas() {
  120. _controller.text = '';
  121. _focusNode.addListener(() {
  122. if (!_focusNode.hasFocus) {
  123. _onInputChanged(_textStyle!, _controller.text);
  124. }
  125. });
  126. final inputText = widget.inputText;
  127. _isReadOnly = inputText.isReadOnly!;
  128. final inputTextInfo = ReportInfo.instance.getElementInfo(inputText);
  129. _inputTextInfo = inputTextInfo as InputTextInfo;
  130. if (_inputTextInfo!.isReadOnly!) {
  131. if (_inputTextInfo!.tag!.name == 'ReportPhysician') {
  132. _controller.text = ReportInfo.instance.reporter ?? '';
  133. }
  134. }
  135. final fontColor = inputText.fontColor;
  136. if (fontColor != null) {
  137. _fontColor = Color.fromARGB(
  138. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
  139. }
  140. final backgroundColor = inputText.background;
  141. if (backgroundColor != null) {
  142. _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
  143. backgroundColor.g!, backgroundColor.b!);
  144. }
  145. _textStyle = TextStyle(
  146. fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
  147. color: _fontColor,
  148. );
  149. //TODO(Loki):set FontName in TextField
  150. final fontName = inputText.fontName;
  151. //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
  152. final fontStyles = inputText.fontStyles;
  153. _lineLength = inputText.lineLength;
  154. _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
  155. _textWrap = inputText.textWrap;
  156. _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
  157. _height = _fontSize! > 30 ? 41 : 22;
  158. ReportInfo.instance.onReloadFinsh.addListener((sender, e) {
  159. _initDatas();
  160. });
  161. setState(() {});
  162. }
  163. }