datetime.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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/alignment_convert.dart';
  4. import 'package:fis_lib_report/report/date_time_element.dart';
  5. import 'package:fis_lib_report/report_info/date_time_info.dart';
  6. import 'package:fis_lib_report/report_info/report_info.dart';
  7. import 'package:fis_ui/index.dart';
  8. import 'package:fis_ui/interface/interactive_container.dart';
  9. import 'package:flutter/material.dart';
  10. class FDateTime extends StatefulWidget implements FInteractiveContainer {
  11. final DateTimeElement dateTimeElement;
  12. const FDateTime(this.dateTimeElement, {Key? key}) : super(key: key);
  13. @override
  14. final String pageName = 'FDateTime';
  15. @override
  16. State<StatefulWidget> createState() {
  17. return _FDateTimeState();
  18. }
  19. }
  20. class _FDateTimeState extends State<FDateTime> {
  21. DateTime selectedDate = DateTime.now();
  22. _FDateTimeState();
  23. String _dateTimeStr = '';
  24. double _fontSize = 14.0;
  25. double _width = 0;
  26. TextStyle _style = const TextStyle();
  27. Color _fontColor = Colors.black;
  28. Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
  29. EdgeInsets _margin = const EdgeInsets.all(0);
  30. DateTimeInfo? _dateTimeInfo;
  31. @override
  32. initState() {
  33. super.initState();
  34. }
  35. @override
  36. FWidget build(BuildContext context) {
  37. final dateTimeElement = widget.dateTimeElement;
  38. _initDatas();
  39. return FContainer(
  40. margin: _margin,
  41. constraints: const BoxConstraints(minHeight: 24),
  42. padding: const EdgeInsets.symmetric(horizontal: 4),
  43. height: _fontSize + 10,
  44. decoration: BoxDecoration(
  45. borderRadius: BorderRadius.circular(4),
  46. border: Border.all(
  47. width: 1,
  48. color:
  49. dateTimeElement.isReadOnly ? Colors.transparent : Colors.grey,
  50. ),
  51. ),
  52. width: _width,
  53. alignment: AlignmentConvert.verticalLayoutConvert(
  54. dateTimeElement.verticalAlignment!),
  55. child: FRow(
  56. mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
  57. dateTimeElement.horizontalAlignment),
  58. children: [
  59. FContainer(
  60. alignment: AlignmentConvert.verticalLayoutConvert(
  61. dateTimeElement.verticalAlignment!),
  62. child: FText(
  63. _dateTimeStr,
  64. style: _style,
  65. textAlign: AlignmentConvert.horizontalAlignmentConvert(
  66. dateTimeElement.horizontalAlignment),
  67. ),
  68. ),
  69. if (!dateTimeElement.isReadOnly) ...[
  70. const FExpanded(child: FSizedBox()),
  71. FGestureDetector(
  72. name: "selectDate",
  73. businessParent: widget,
  74. onTap: () => _selectDate(context),
  75. child: const FIcon(
  76. Icons.date_range_outlined,
  77. size: 17,
  78. ),
  79. ),
  80. ],
  81. ],
  82. ));
  83. }
  84. _selectDate(BuildContext context) async {
  85. final DateTime? picked = await showDatePicker(
  86. context: context,
  87. initialDate: selectedDate, // Refer step 1
  88. firstDate: DateTime(2000),
  89. lastDate: DateTime(2025),
  90. );
  91. if (picked != null && picked != selectedDate) {
  92. final format = widget.dateTimeElement.dateTimeFormat;
  93. setState(() {
  94. selectedDate = picked;
  95. //_dateTimeConvert(format!, selectedDate.millisecondsSinceEpoch);
  96. _dateTimeInfo!.text = selectedDate.toString();
  97. });
  98. }
  99. }
  100. void _initDatas() {
  101. final dateTimeElement = widget.dateTimeElement;
  102. final format = dateTimeElement.dateTimeFormat;
  103. final dateTimeInfo =
  104. FReportInfo.instance.getElementInfo(dateTimeElement) as DateTimeInfo?;
  105. if (dateTimeInfo != null && dateTimeInfo != _dateTimeInfo) {
  106. if (_dateTimeInfo != null) {
  107. _dateTimeInfo!.onTextChange.dispose();
  108. }
  109. _dateTimeInfo = dateTimeInfo;
  110. _dateTimeInfo!.onTextChange.addListener((sender, e) {
  111. if (mounted) {
  112. setState(() {
  113. final date = DateTime.parse(_dateTimeInfo!.text.trim());
  114. _dateTimeConvert(format!, date.millisecondsSinceEpoch);
  115. });
  116. }
  117. });
  118. }
  119. if (_dateTimeInfo!.text.isNotEmpty) {
  120. final date = DateTime.parse(_dateTimeInfo!.text.trim());
  121. final dateStr = DateToStringConverter.dateTimeConvert(
  122. format!, date.millisecondsSinceEpoch);
  123. if (dateStr != _dateTimeStr) {
  124. _dateTimeStr = dateStr.trim();
  125. }
  126. }
  127. //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
  128. final fontStyles = dateTimeElement.fontStyles;
  129. final fontColor = dateTimeElement.fontColor;
  130. if (fontColor != null) {
  131. _fontColor = Color.fromARGB(
  132. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
  133. }
  134. final backgroundColor = dateTimeElement.background;
  135. if (backgroundColor != null) {
  136. _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
  137. backgroundColor.g!, backgroundColor.b!);
  138. if (_backgroundColor == Colors.white) {
  139. _backgroundColor = Colors.transparent;
  140. }
  141. }
  142. final margin = dateTimeElement.margin;
  143. if (margin != null) {
  144. _margin = EdgeInsets.only(
  145. top: margin.top ?? 0,
  146. bottom: margin.bottom ?? 0,
  147. left: margin.left ?? 0,
  148. right: margin.right ?? 0);
  149. }
  150. _fontSize = PtToPxConverter.ptToPx(dateTimeElement.fontSize ?? 14);
  151. _style = TextStyle(
  152. fontSize: _fontSize,
  153. color: _fontColor,
  154. backgroundColor: _backgroundColor,
  155. );
  156. _width = (_fontSize * 2 / 3) * _dateTimeStr.length;
  157. if (!dateTimeElement.isReadOnly) {
  158. var contentWidth = PtToPxConverter.ptToPx(dateTimeElement.lineWidth);
  159. _width = contentWidth;
  160. }
  161. }
  162. void _dateTimeConvert(String format, int timestamp) {
  163. _dateTimeStr =
  164. DateToStringConverter.dateTimeConvert(format, timestamp).trim();
  165. }
  166. }