input_text.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. late final InputText inputText;
  20. final _controller = TextEditingController();
  21. final _focusNode = FocusNode();
  22. double? _lineWidth = 136.0;
  23. double? _fontSize = 22.0;
  24. double? _height = 22.0;
  25. bool? _textWrap = false;
  26. Color _fontColor = const Color.fromARGB(255, 0, 0, 0);
  27. Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
  28. int? _lineLength = 1;
  29. TextStyle? _textStyle;
  30. InputTextInfo? _inputTextInfo;
  31. bool _isReadOnly = false;
  32. @override
  33. initState() {
  34. inputText = widget.inputText;
  35. _isReadOnly = inputText.isReadOnly!;
  36. final inputTextInfo = ReportInfo.instance.getElementInfo(inputText);
  37. _inputTextInfo = inputTextInfo as InputTextInfo;
  38. if (inputText.isReadOnly!) {
  39. if (_inputTextInfo!.tag!.name == 'ReportPhysician') {
  40. _controller.text = ReportInfo.instance.reporter ?? '';
  41. }
  42. }
  43. final fontColor = inputText.fontColor;
  44. if (fontColor != null) {
  45. _fontColor = Color.fromARGB(
  46. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
  47. }
  48. final backgroundColor = inputText.background;
  49. if (backgroundColor != null) {
  50. _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
  51. backgroundColor.g!, backgroundColor.b!);
  52. }
  53. _textStyle = TextStyle(
  54. fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
  55. color: _fontColor,
  56. );
  57. //TODO(Loki):set FontName in TextField
  58. final fontName = inputText.fontName;
  59. //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
  60. final fontStyles = inputText.fontStyles;
  61. _lineLength = inputText.lineLength;
  62. _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
  63. _textWrap = inputText.textWrap;
  64. _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
  65. _height = _fontSize! > 30 ? 43 : 22;
  66. _focusNode.addListener(() {
  67. if (!_focusNode.hasFocus) {
  68. _onInputChanged(_textStyle!, _controller.text);
  69. }
  70. });
  71. super.initState();
  72. }
  73. @override
  74. Widget build(BuildContext context) {
  75. return Container(
  76. //constraints: BoxConstraints(minWidth: _lineWidth!, maxWidth: 480),
  77. width: _lineWidth,
  78. height: _textWrap! ? _height! * 4 : (_height!),
  79. padding: const EdgeInsets.only(right: 5, left: 5),
  80. decoration: BoxDecoration(
  81. border: Border.all(
  82. width: 1,
  83. color: _isReadOnly ? Colors.transparent : Colors.grey,
  84. ),
  85. color: _backgroundColor,
  86. ),
  87. child: TextField(
  88. focusNode: _focusNode,
  89. readOnly: _isReadOnly,
  90. decoration: null,
  91. textAlignVertical: AlignmentConvert.verticalAlignmentConvert(
  92. inputText.verticalAlignment),
  93. minLines: 1,
  94. maxLines: _textWrap! ? 6 : 1,
  95. controller: _controller,
  96. textAlign: TextAlign.start,
  97. style: _textStyle,
  98. onChanged: (v) {
  99. // _onInputChanged(_textStyle!, v);
  100. },
  101. onEditingComplete: () {
  102. _onInputChanged(_textStyle!, _controller.text);
  103. }),
  104. );
  105. }
  106. //onchange 事件
  107. void _onInputChanged(TextStyle _textStyle, String value) {
  108. if (_inputTextInfo != null) {
  109. _inputTextInfo!.text = value;
  110. }
  111. final width = TextSizeConvert.getTextSize(value, _textStyle).width + 15;
  112. //TODO(LOki):此处需要区分不同的输入框
  113. if (inputText.tag!.name == 'HospitalName') {
  114. if (_lineWidth! < width) {
  115. setState(() {
  116. if (width < 480) {
  117. _lineWidth = width;
  118. }
  119. });
  120. } else if (_controller.text.isEmpty) {
  121. setState(() {
  122. //重置长度
  123. _lineWidth = inputText.lineWidth;
  124. });
  125. } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle)
  126. .width >
  127. inputText.lineWidth!) {
  128. setState(() {
  129. if (width < 480) {
  130. _lineWidth = width;
  131. }
  132. });
  133. }
  134. }
  135. }
  136. @override
  137. void dispose() {
  138. _controller.dispose();
  139. super.dispose();
  140. }
  141. }