input_text.dart 4.5 KB

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