datetime.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import 'package:fis_lib_report/converts/date_to_string_converter.dart';
  2. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  3. import 'package:fis_lib_report/converts/text_size_converter.dart';
  4. import 'package:fis_lib_report/converts/alignment_convert.dart';
  5. import 'package:fis_lib_report/report/dateTimeElement.dart';
  6. import 'package:fis_lib_report/report_info/date_time_info.dart';
  7. import 'package:fis_lib_report/report_info/report_info.dart';
  8. import 'package:flutter/material.dart';
  9. class RDateTime extends StatefulWidget {
  10. final DateTimeElement dateTimeElement;
  11. const RDateTime(this.dateTimeElement);
  12. @override
  13. State<StatefulWidget> createState() {
  14. return _RDateTimeState();
  15. }
  16. }
  17. class _RDateTimeState extends State<RDateTime> {
  18. DateTime selectedDate = DateTime.now();
  19. _RDateTimeState();
  20. String _dateTimeStr = '';
  21. double _fontSize = 15.0;
  22. double _width = 0;
  23. TextStyle _style = const TextStyle();
  24. Color _fontColor = Colors.black;
  25. Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
  26. EdgeInsets _margin = const EdgeInsets.all(0);
  27. DateTimeInfo? _dateTimeInfo;
  28. @override
  29. initState() {
  30. super.initState();
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. final dateTimeElement = widget.dateTimeElement;
  35. _initDatas();
  36. return Container(
  37. margin: _margin,
  38. decoration: BoxDecoration(
  39. border: Border.all(
  40. width: 1,
  41. color:
  42. dateTimeElement.isReadOnly! ? Colors.transparent : Colors.grey,
  43. ),
  44. ),
  45. width: _width,
  46. alignment: AlignmentConvert.verticalLayoutConvert(
  47. dateTimeElement.verticalAlignment!),
  48. child: Row(
  49. mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
  50. dateTimeElement.horizontalAlignment),
  51. children: [
  52. Container(
  53. margin: _margin,
  54. alignment: AlignmentConvert.verticalLayoutConvert(
  55. dateTimeElement.verticalAlignment!),
  56. child: Text(
  57. _dateTimeStr,
  58. style: _style,
  59. textAlign: AlignmentConvert.horizontalAlignmentConvert(
  60. dateTimeElement.horizontalAlignment),
  61. ),
  62. ),
  63. if (!dateTimeElement.isReadOnly!) ...[
  64. const Expanded(child: SizedBox()),
  65. GestureDetector(
  66. onTap: () => _selectDate(context),
  67. child: const Icon(
  68. Icons.date_range_outlined,
  69. size: 20,
  70. ),
  71. ),
  72. ],
  73. ],
  74. ));
  75. }
  76. _selectDate(BuildContext context) async {
  77. final DateTime? picked = await showDatePicker(
  78. context: context,
  79. initialDate: selectedDate, // Refer step 1
  80. firstDate: DateTime(2000),
  81. lastDate: DateTime(2025),
  82. );
  83. if (picked != null && picked != selectedDate) {
  84. final format = widget.dateTimeElement.dateTimeFormat;
  85. setState(() {
  86. selectedDate = picked;
  87. _dateTimeConvert(format!, selectedDate.millisecondsSinceEpoch);
  88. });
  89. }
  90. }
  91. void _initDatas() {
  92. final dateTimeElement = widget.dateTimeElement;
  93. final format = dateTimeElement.dateTimeFormat;
  94. final dateTimeInfo =
  95. ReportInfo.instance.getElementInfo(dateTimeElement) as DateTimeInfo?;
  96. if (dateTimeInfo != null && dateTimeInfo != _dateTimeInfo) {
  97. if (_dateTimeInfo != null) {
  98. _dateTimeInfo!.onTextChange.dispose();
  99. }
  100. _dateTimeInfo = dateTimeInfo;
  101. _dateTimeInfo!.onTextChange.addListener((sender, e) {
  102. if (mounted) {
  103. setState(() {
  104. final date = DateTime.parse(_dateTimeInfo!.text.trim());
  105. _dateTimeConvert(format!, date.millisecondsSinceEpoch);
  106. });
  107. }
  108. });
  109. }
  110. final date = DateTime.parse(_dateTimeInfo!.text.trim());
  111. final dateStr = DateToStringConverter.dateTimeConvert(
  112. format!, date.millisecondsSinceEpoch);
  113. if (dateStr != _dateTimeStr) {
  114. _dateTimeStr = dateStr;
  115. }
  116. _fontSize = dateTimeElement.fontSize ?? 15.0;
  117. //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
  118. final fontStyles = dateTimeElement.fontStyles;
  119. final fontColor = dateTimeElement.fontColor;
  120. if (fontColor != null) {
  121. _fontColor = Color.fromARGB(
  122. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
  123. }
  124. final backgroundColor = dateTimeElement.background;
  125. if (backgroundColor != null) {
  126. _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
  127. backgroundColor.g!, backgroundColor.b!);
  128. }
  129. final margin = dateTimeElement.margin;
  130. if (margin != null) {
  131. _margin = EdgeInsets.only(
  132. top: margin.top ?? 0,
  133. bottom: margin.bottom ?? 0,
  134. left: margin.left ?? 0,
  135. right: margin.right ?? 0);
  136. }
  137. _style = TextStyle(
  138. fontSize: PtToPxConverter.ptToPx(_fontSize),
  139. color: _fontColor,
  140. backgroundColor: _backgroundColor,
  141. );
  142. _width = PtToPxConverter.ptToPx(
  143. TextSizeConvert.getTextSize(_dateTimeStr, _style).width);
  144. }
  145. void _dateTimeConvert(String format, int timestamp) {
  146. _dateTimeStr =
  147. DateToStringConverter.dateTimeConvert(format, timestamp).trim();
  148. }
  149. }