rt_table.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. _cells = widget.element.cells ?? {};
  30. List<CellPostion> cellPostions = _cells!.keys.toList();
  31. cellPostions.sort(((a, b) => (b.column!).compareTo(a.column!)));
  32. // +1 为列数
  33. _column = cellPostions.first.column! + 1;
  34. _values = _cells!.values.toList();
  35. for (int i = 0; i < _column! - 1; i++) {
  36. _width += widget.element.columnDefinitions![i].width!;
  37. }
  38. _row = widget.element.rowDefinitions!.length + 1;
  39. }
  40. @override
  41. Widget build(BuildContext context) {
  42. List<Widget> widgets = [];
  43. for (int i = 0; i < _row! - 1; i++) {
  44. final children = _cells!.keys.where((element) => element.row! == i);
  45. List<Widget> childwidgets = [];
  46. children.forEach((cellPostion) {
  47. double width =
  48. widget.element.columnDefinitions![cellPostion.column!].width ?? 0.0;
  49. if (cellPostion.columnSpan! > 1) {
  50. for (int i = 1; i < cellPostion.columnSpan!; i++) {
  51. width += widget.element.columnDefinitions![cellPostion.column! + i]
  52. .width ??
  53. 0.0;
  54. }
  55. }
  56. double height =
  57. widget.element.rowDefinitions![cellPostion.row!].height ?? 0.0;
  58. if (cellPostion.rowSpan! > 1) {
  59. for (int i = 1; i < cellPostion.rowSpan!; i++) {
  60. height +=
  61. widget.element.rowDefinitions![cellPostion.row! + i].height ??
  62. 0.0;
  63. }
  64. }
  65. final cell = _cells![cellPostion];
  66. RTCell c = cell as RTCell;
  67. childwidgets.add(
  68. SizedBox(
  69. width: PtToPxConverter.ptToPx(width),
  70. height: PtToPxConverter.ptToPx(height),
  71. child: RTCellPage(
  72. cell: c,
  73. ),
  74. ),
  75. );
  76. });
  77. final row = SizedBox(
  78. child: Row(
  79. //mainAxisAlignment: MainAxisAlignment.center,
  80. children: childwidgets,
  81. ),
  82. );
  83. widgets.add(row);
  84. }
  85. return Container(
  86. alignment: AlignmentConvert.horizontalConvert(
  87. widget.element.horizontalAlignment),
  88. child: Column(
  89. mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
  90. widget.element.horizontalAlignment),
  91. children: widgets,
  92. ),
  93. );
  94. }
  95. }