diff --git a/packages/flutter/lib/src/rendering/sliver.dart b/packages/flutter/lib/src/rendering/sliver.dart index 6d8a569859..726ce8d278 100644 --- a/packages/flutter/lib/src/rendering/sliver.dart +++ b/packages/flutter/lib/src/rendering/sliver.dart @@ -1425,6 +1425,10 @@ abstract class RenderSliver extends RenderObject { /// This means that the dimensions may be negative. /// /// This is only valid after [layout] has completed. + /// + /// See also: + /// + /// * [getAbsoluteSize], which returns absolute size. @protected Size getAbsoluteSizeRelativeToOrigin() { assert(geometry != null); @@ -1442,6 +1446,30 @@ abstract class RenderSliver extends RenderObject { return null; } + /// This returns the absolute [Size] of the sliver. + /// + /// The dimensions are always positive and calling this is only valid after + /// [layout] has completed. + /// + /// See also: + /// + /// * [getAbsoluteSizeRelativeToOrigin], which returns the size relative to + /// the leading edge of the sliver. + @protected + Size getAbsoluteSize() { + assert(geometry != null); + assert(!debugNeedsLayout); + switch (constraints.axisDirection) { + case AxisDirection.up: + case AxisDirection.down: + return Size(constraints.crossAxisExtent, geometry.paintExtent); + case AxisDirection.right: + case AxisDirection.left: + return Size(geometry.paintExtent, constraints.crossAxisExtent); + } + return null; + } + void _debugDrawArrow(Canvas canvas, Paint paint, Offset p0, Offset p1, GrowthDirection direction) { assert(() { if (p0 == p1) diff --git a/packages/flutter/lib/src/rendering/sliver_padding.dart b/packages/flutter/lib/src/rendering/sliver_padding.dart index efb2271d30..01cf8a275f 100644 --- a/packages/flutter/lib/src/rendering/sliver_padding.dart +++ b/packages/flutter/lib/src/rendering/sliver_padding.dart @@ -328,12 +328,12 @@ class RenderSliverPadding extends RenderSliver with RenderObjectWithChildMixin= outerRect.top); diff --git a/packages/flutter/test/rendering/debug_test.dart b/packages/flutter/test/rendering/debug_test.dart index 1045f0a304..7524a27a10 100644 --- a/packages/flutter/test/rendering/debug_test.dart +++ b/packages/flutter/test/rendering/debug_test.dart @@ -124,4 +124,70 @@ void main() { expect(b.debugPaint, isNot(paints..rect(color: const Color(0x90909090)))); debugPaintSizeEnabled = false; }); + + test('debugPaintPadding from render objects with inverted direction vertical', () { + debugPaintSizeEnabled = true; + RenderSliver s; + final RenderViewport root = RenderViewport( + axisDirection: AxisDirection.up, + crossAxisDirection: AxisDirection.right, + offset: ViewportOffset.zero(), + children: [ + s = RenderSliverPadding( + padding: const EdgeInsets.all(10.0), + child: RenderSliverToBoxAdapter( + child: RenderPadding( + padding: const EdgeInsets.all(10.0), + ), + ), + ), + ], + ); + layout(root); + dynamic error; + try { + s.debugPaint( + PaintingContext( + ContainerLayer(), const Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)), + const Offset(0.0, 500) + ); + } catch(e) { + error = e; + } + expect(error, isNull); + debugPaintSizeEnabled = false; + }); + + test('debugPaintPadding from render objects with inverted direction horizontal', () { + debugPaintSizeEnabled = true; + RenderSliver s; + final RenderViewport root = RenderViewport( + axisDirection: AxisDirection.left, + crossAxisDirection: AxisDirection.down, + offset: ViewportOffset.zero(), + children: [ + s = RenderSliverPadding( + padding: const EdgeInsets.all(10.0), + child: RenderSliverToBoxAdapter( + child: RenderPadding( + padding: const EdgeInsets.all(10.0), + ), + ), + ), + ], + ); + layout(root); + dynamic error; + try { + s.debugPaint( + PaintingContext( + ContainerLayer(), const Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)), + const Offset(0.0, 500) + ); + } catch(e) { + error = e; + } + expect(error, isNull); + debugPaintSizeEnabled = false; + }); }