rt_table.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import 'dart:math';
  2. import 'package:fis_lib_report/converts/alignment_convert.dart';
  3. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  4. import 'package:fis_lib_report/pages/rt_cell.dart';
  5. import 'package:fis_lib_report/report/cellPostion.dart';
  6. import 'package:fis_lib_report/report/interfaces/block_element.dart';
  7. import 'package:fis_lib_report/report/interfaces/cell.dart';
  8. import 'package:fis_lib_report/report/interfaces/rt_table.dart';
  9. import 'package:fis_lib_report/report/rt_Cell.dart';
  10. import 'package:fis_lib_report/report/rt_table.dart';
  11. import 'package:flutter/cupertino.dart';
  12. class RTTablePage extends StatefulWidget {
  13. const RTTablePage({required this.element, Key? key}) : super(key: key);
  14. final RTTable element;
  15. @override
  16. State<StatefulWidget> createState() {
  17. return _RTTableState();
  18. }
  19. }
  20. class _RTTableState extends State<RTTablePage> {
  21. Map<CellPostion, ICell>? _cells;
  22. List<ICell>? _values = [];
  23. int? _column;
  24. int? _row;
  25. double _width = 0;
  26. @override
  27. initState() {
  28. super.initState();
  29. }
  30. @override
  31. Widget build(BuildContext context) {
  32. initCells();
  33. List<Widget> widgets = [];
  34. for (int i = 0; i < _row! - 1; i++) {
  35. final children = _cells!.keys.where((element) => element.row! == i);
  36. List<Widget> childwidgets = [];
  37. children.forEach((cellPostion) {
  38. double width =
  39. widget.element.columnDefinitions![cellPostion.column!].width ?? 0.0;
  40. if (cellPostion.columnSpan! > 1) {
  41. for (int i = 1; i < cellPostion.columnSpan!; i++) {
  42. width += widget.element.columnDefinitions![cellPostion.column! + i]
  43. .width ??
  44. 0.0;
  45. }
  46. }
  47. double height =
  48. widget.element.rowDefinitions![cellPostion.row!].height ?? 0.0;
  49. if (cellPostion.rowSpan! > 1) {
  50. for (int i = 1; i < cellPostion.rowSpan!; i++) {
  51. height += widget
  52. .element.rowDefinitions![cellPostion.row! + i - 1].height ??
  53. 0.0;
  54. }
  55. }
  56. final cell = _cells![cellPostion];
  57. RTCell c = cell as RTCell;
  58. childwidgets.add(
  59. SizedBox(
  60. width: PtToPxConverter.ptToPx(width),
  61. height: PtToPxConverter.ptToPx(height),
  62. child: RTCellPage(
  63. cell: c,
  64. ),
  65. ),
  66. );
  67. });
  68. final row = SizedBox(
  69. child: Row(
  70. //mainAxisAlignment: MainAxisAlignment.center,
  71. children: childwidgets,
  72. ),
  73. );
  74. widgets.add(row);
  75. }
  76. return Container(
  77. alignment: AlignmentConvert.horizontalConvert(
  78. widget.element.horizontalAlignment),
  79. child: Column(
  80. mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
  81. widget.element.horizontalAlignment),
  82. children: widgets,
  83. ),
  84. );
  85. }
  86. void initCells() {
  87. _cells = widget.element.cells ?? {};
  88. List<CellPostion> cellPostions = _cells!.keys.toList();
  89. cellPostions.sort(((a, b) => (b.column!).compareTo(a.column!)));
  90. // +1 为列数
  91. _column = cellPostions.first.column! + 1;
  92. _values = _cells!.values.toList();
  93. for (int i = 0; i < _column! - 1; i++) {
  94. _width += widget.element.columnDefinitions![i].width!;
  95. }
  96. _row = widget.element.rowDefinitions!.length + 1;
  97. }
  98. }