@@ -308,6 +308,13 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
308308 );
309309 }
310310
311+ // TODO(Piinks): Pinned rows/cols do not account for what is visible on the
312+ // screen. Ostensibly, we would not want to have pinned rows/columns that
313+ // extend beyond the viewport, we would never see them as they would never
314+ // scroll into view. So this currently implementation is fairly assuming
315+ // we will never have rows/cols that are outside of the viewport. We should
316+ // maybe add an assertion for this during layout.
317+ // https://github.com/flutter/flutter/issues/136833
311318 int ? get _lastPinnedRow =>
312319 delegate.pinnedRowCount > 0 ? delegate.pinnedRowCount - 1 : null ;
313320 int ? get _lastPinnedColumn =>
@@ -667,12 +674,17 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
667674 }) {
668675 // TODO(Piinks): Assert here or somewhere else merged cells cannot span
669676 // pinned and unpinned cells (for merged cell follow-up), https://github.com/flutter/flutter/issues/131224
677+ _Span colSpan, rowSpan;
670678 double yPaintOffset = - offset.dy;
671679 for (int row = start.row; row <= end.row; row += 1 ) {
672680 double xPaintOffset = - offset.dx;
673- final double rowHeight = _rowMetrics[row]! .extent;
681+ rowSpan = _rowMetrics[row]! ;
682+ final double rowHeight = rowSpan.extent;
683+ yPaintOffset += rowSpan.configuration.padding.leading;
674684 for (int column = start.column; column <= end.column; column += 1 ) {
675- final double columnWidth = _columnMetrics[column]! .extent;
685+ colSpan = _columnMetrics[column]! ;
686+ final double columnWidth = colSpan.extent;
687+ xPaintOffset += colSpan.configuration.padding.leading;
676688
677689 final TableVicinity vicinity = TableVicinity (column: column, row: row);
678690 // TODO(Piinks): Add back merged cells, https://github.com/flutter/flutter/issues/131224
@@ -689,9 +701,11 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
689701 cell.layout (cellConstraints);
690702 cellParentData.layoutOffset = Offset (xPaintOffset, yPaintOffset);
691703 }
692- xPaintOffset += columnWidth;
704+ xPaintOffset += columnWidth +
705+ _columnMetrics[column]! .configuration.padding.trailing;
693706 }
694- yPaintOffset += rowHeight;
707+ yPaintOffset +=
708+ rowHeight + _rowMetrics[row]! .configuration.padding.trailing;
695709 }
696710 }
697711
@@ -836,29 +850,45 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
836850 final LinkedHashMap <Rect , TableSpanDecoration > backgroundColumns =
837851 LinkedHashMap <Rect , TableSpanDecoration >();
838852
853+ final TableSpan rowSpan = _rowMetrics[leading.row]! .configuration;
839854 for (int column = leading.column; column <= trailing.column; column++ ) {
840- final _Span span = _columnMetrics[column]! ;
841- if (span.configuration .backgroundDecoration != null ||
842- span.configuration .foregroundDecoration != null ) {
855+ final TableSpan columnSpan = _columnMetrics[column]! .configuration ;
856+ if (columnSpan .backgroundDecoration != null ||
857+ columnSpan .foregroundDecoration != null ) {
843858 final RenderBox leadingCell = getChildFor (
844859 TableVicinity (column: column, row: leading.row),
845860 )! ;
846861 final RenderBox trailingCell = getChildFor (
847862 TableVicinity (column: column, row: trailing.row),
848863 )! ;
849864
850- final Rect rect = Rect .fromPoints (
851- parentDataOf (leadingCell).paintOffset! + offset,
852- parentDataOf (trailingCell).paintOffset! +
853- Offset (trailingCell.size.width, trailingCell.size.height) +
854- offset,
855- );
865+ Rect getColumnRect (bool consumePadding) {
866+ return Rect .fromPoints (
867+ parentDataOf (leadingCell).paintOffset! +
868+ offset -
869+ Offset (
870+ consumePadding ? columnSpan.padding.leading : 0.0 ,
871+ rowSpan.padding.leading,
872+ ),
873+ parentDataOf (trailingCell).paintOffset! +
874+ offset +
875+ Offset (trailingCell.size.width, trailingCell.size.height) +
876+ Offset (
877+ consumePadding ? columnSpan.padding.trailing : 0.0 ,
878+ rowSpan.padding.trailing,
879+ ),
880+ );
881+ }
856882
857- if (span.configuration.backgroundDecoration != null ) {
858- backgroundColumns[rect] = span.configuration.backgroundDecoration! ;
883+ if (columnSpan.backgroundDecoration != null ) {
884+ final Rect rect = getColumnRect (
885+ columnSpan.backgroundDecoration! .consumeSpanPadding);
886+ backgroundColumns[rect] = columnSpan.backgroundDecoration! ;
859887 }
860- if (span.configuration.foregroundDecoration != null ) {
861- foregroundColumns[rect] = span.configuration.foregroundDecoration! ;
888+ if (columnSpan.foregroundDecoration != null ) {
889+ final Rect rect = getColumnRect (
890+ columnSpan.foregroundDecoration! .consumeSpanPadding);
891+ foregroundColumns[rect] = columnSpan.foregroundDecoration! ;
862892 }
863893 }
864894 }
@@ -869,28 +899,45 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
869899 final LinkedHashMap <Rect , TableSpanDecoration > backgroundRows =
870900 LinkedHashMap <Rect , TableSpanDecoration >();
871901
902+ final TableSpan columnSpan = _columnMetrics[leading.column]! .configuration;
872903 for (int row = leading.row; row <= trailing.row; row++ ) {
873- final _Span span = _rowMetrics[row]! ;
874- if (span.configuration .backgroundDecoration != null ||
875- span.configuration .foregroundDecoration != null ) {
904+ final TableSpan rowSpan = _rowMetrics[row]! .configuration ;
905+ if (rowSpan .backgroundDecoration != null ||
906+ rowSpan .foregroundDecoration != null ) {
876907 final RenderBox leadingCell = getChildFor (
877908 TableVicinity (column: leading.column, row: row),
878909 )! ;
879910 final RenderBox trailingCell = getChildFor (
880911 TableVicinity (column: trailing.column, row: row),
881912 )! ;
882913
883- final Rect rect = Rect .fromPoints (
884- parentDataOf (leadingCell).paintOffset! + offset,
885- parentDataOf (trailingCell).paintOffset! +
886- Offset (trailingCell.size.width, trailingCell.size.height) +
887- offset,
888- );
889- if (span.configuration.backgroundDecoration != null ) {
890- backgroundRows[rect] = span.configuration.backgroundDecoration! ;
914+ Rect getRowRect (bool consumePadding) {
915+ return Rect .fromPoints (
916+ parentDataOf (leadingCell).paintOffset! +
917+ offset -
918+ Offset (
919+ columnSpan.padding.leading,
920+ consumePadding ? rowSpan.padding.leading : 0.0 ,
921+ ),
922+ parentDataOf (trailingCell).paintOffset! +
923+ offset +
924+ Offset (trailingCell.size.width, trailingCell.size.height) +
925+ Offset (
926+ columnSpan.padding.leading,
927+ consumePadding ? rowSpan.padding.trailing : 0.0 ,
928+ ),
929+ );
930+ }
931+
932+ if (rowSpan.backgroundDecoration != null ) {
933+ final Rect rect =
934+ getRowRect (rowSpan.backgroundDecoration! .consumeSpanPadding);
935+ backgroundRows[rect] = rowSpan.backgroundDecoration! ;
891936 }
892- if (span.configuration.foregroundDecoration != null ) {
893- foregroundRows[rect] = span.configuration.foregroundDecoration! ;
937+ if (rowSpan.foregroundDecoration != null ) {
938+ final Rect rect =
939+ getRowRect (rowSpan.foregroundDecoration! .consumeSpanPadding);
940+ foregroundRows[rect] = rowSpan.foregroundDecoration! ;
894941 }
895942 }
896943 }
@@ -1028,7 +1075,12 @@ class _Span
10281075 bool get isPinned => _isPinned;
10291076 late bool _isPinned;
10301077
1031- double get trailingOffset => leadingOffset + extent;
1078+ double get trailingOffset {
1079+ return leadingOffset +
1080+ extent +
1081+ configuration.padding.leading +
1082+ configuration.padding.trailing;
1083+ }
10321084
10331085 // ---- Span Management ----
10341086
0 commit comments