input_text.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  2. import 'package:fis_lib_report/converts/vertical_alignment.dart';
  3. import 'package:fis_lib_report/report/inputText.dart';
  4. import 'package:fis_lib_report/report/interfaces/position_layout.dart';
  5. import 'package:flutter/cupertino.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter/rendering.dart';
  8. class RInputText extends StatefulWidget {
  9. final InputText inputText;
  10. const RInputText({Key? key, required this.inputText}) : super(key: key);
  11. @override
  12. State<StatefulWidget> createState() {
  13. return _RInputTextState(inputText: inputText);
  14. }
  15. }
  16. class _RInputTextState extends State<RInputText> {
  17. _RInputTextState({required this.inputText});
  18. final InputText inputText;
  19. final _controller = TextEditingController(text: '');
  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. @override
  30. initState() {
  31. final fontColor = inputText.fontColor;
  32. if (fontColor != null) {
  33. _fontColor = Color.fromARGB(
  34. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
  35. }
  36. final backgroundColor = inputText.background;
  37. if (backgroundColor != null) {
  38. _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
  39. backgroundColor.g!, backgroundColor.b!);
  40. }
  41. _textStyle = TextStyle(
  42. fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
  43. color: _fontColor,
  44. );
  45. //TODO(Loki):set FontName in TextField
  46. final fontName = inputText.fontName;
  47. //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
  48. final fontStyles = inputText.fontStyles;
  49. _lineLength = inputText.lineLength;
  50. _lineWidth = inputText.lineWidth;
  51. _textWrap = inputText.textWrap;
  52. _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
  53. _height = _fontSize! > 30 ? 36.5 : 22;
  54. print(_lineLength);
  55. super.initState();
  56. }
  57. @override
  58. Widget build(BuildContext context) {
  59. final _textStyle = TextStyle(
  60. fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
  61. color: _fontColor,
  62. );
  63. return Container(
  64. width: PtToPxConverter.ptToPx(_lineWidth!),
  65. height: _textWrap! ? _height! * 4 : (_height! + 5),
  66. padding: EdgeInsets.only(top: _textWrap! ? 10 : 5, right: 5, left: 5),
  67. decoration: BoxDecoration(
  68. border: Border.all(
  69. width: 1,
  70. color: Colors.grey,
  71. ),
  72. color: _backgroundColor,
  73. ),
  74. alignment: Alignment.center,
  75. child: TextField(
  76. focusNode: _focusNode,
  77. readOnly: inputText.isReadOnly ?? false,
  78. cursorHeight: _height!,
  79. decoration: InputDecoration.collapsed(
  80. hintText: '',
  81. hintStyle: TextStyle(
  82. fontSize: _fontSize,
  83. color: Colors.black54,
  84. ),
  85. fillColor: _backgroundColor,
  86. filled: true,
  87. ),
  88. textAlignVertical:
  89. VerticalAlignmentToAlignVertical.VerticalAlignmentConvert(
  90. inputText.verticalAlignment),
  91. maxLines: _textWrap! ? 6 : 1,
  92. minLines: _textWrap! ? 6 : 1,
  93. controller: _controller,
  94. textAlign: TextAlign.start,
  95. style: _textStyle,
  96. onChanged: (v) {
  97. _onInputChanged(_textStyle, v);
  98. },
  99. ),
  100. );
  101. }
  102. ///计算文本Size
  103. static Size _boundingTextSize(String text, TextStyle style,
  104. {int maxLines = 2 ^ 31, double maxWidth = double.infinity}) {
  105. if (text.isEmpty) {
  106. return Size.zero;
  107. }
  108. final TextPainter textPainter = TextPainter(
  109. textDirection: TextDirection.ltr,
  110. text: TextSpan(text: text, style: style),
  111. maxLines: maxLines)
  112. ..layout(maxWidth: maxWidth);
  113. return textPainter.size;
  114. }
  115. //onchange 事件
  116. void _onInputChanged(TextStyle _textStyle, String value) {
  117. final width = _boundingTextSize(value, _textStyle).width;
  118. // ignore: todo
  119. //TODO(LOki):此处需要区分不同的输入框
  120. if (inputText.tag!.name == 'HospitalName') {
  121. if (_lineWidth! < width) {
  122. setState(() {
  123. if (width < 500) {
  124. _lineWidth = width;
  125. }
  126. });
  127. } else if (_controller.text.isEmpty) {
  128. setState(() {
  129. //重置长度
  130. _lineWidth = inputText.lineWidth;
  131. });
  132. } else if (_boundingTextSize(_controller.text, _textStyle).width >
  133. inputText.lineWidth!) {
  134. setState(() {
  135. if (width < 500) {
  136. _lineWidth = width;
  137. }
  138. });
  139. }
  140. }
  141. }
  142. }