diff --git a/packages/flutter/lib/src/rendering/animated_size.dart b/packages/flutter/lib/src/rendering/animated_size.dart index cbce56c38c..c74b6105be 100644 --- a/packages/flutter/lib/src/rendering/animated_size.dart +++ b/packages/flutter/lib/src/rendering/animated_size.dart @@ -264,7 +264,8 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (child == null || constraints.isTight) { return constraints.smallest; } diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index cedd6362b9..1449d8b8fb 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -1906,7 +1906,7 @@ abstract class RenderBox extends RenderObject { /// [debugCannotComputeDryLayout] from within an assert and return a dummy /// value of `const Size(0, 0)`. @protected - Size computeDryLayout(BoxConstraints constraints) { + Size computeDryLayout(covariant BoxConstraints constraints) { assert(debugCannotComputeDryLayout( error: FlutterError.fromParts([ ErrorSummary('The ${objectRuntimeType(this, 'RenderBox')} class does not implement "computeDryLayout".'), diff --git a/packages/flutter/lib/src/rendering/custom_layout.dart b/packages/flutter/lib/src/rendering/custom_layout.dart index 7c28feca82..f37869dddc 100644 --- a/packages/flutter/lib/src/rendering/custom_layout.dart +++ b/packages/flutter/lib/src/rendering/custom_layout.dart @@ -393,7 +393,8 @@ class RenderCustomMultiChildLayoutBox extends RenderBox } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _getSize(constraints); } diff --git a/packages/flutter/lib/src/rendering/editable.dart b/packages/flutter/lib/src/rendering/editable.dart index 0cc82b8e0a..5aba853fea 100644 --- a/packages/flutter/lib/src/rendering/editable.dart +++ b/packages/flutter/lib/src/rendering/editable.dart @@ -2270,7 +2270,8 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin, bool get _canComputeIntrinsics => _canComputeIntrinsicsCached ??= _canComputeDryLayoutForInlineWidgets(); @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (!_canComputeIntrinsics) { assert(debugCannotComputeDryLayout( reason: 'Dry layout not available for alignments that require baseline.', @@ -2630,7 +2631,8 @@ class _RenderEditableCustomPaint extends RenderBox { } @override - Size computeDryLayout(BoxConstraints constraints) => constraints.biggest; + @protected + Size computeDryLayout(covariant BoxConstraints constraints) => constraints.biggest; } /// An interface that paints within a [RenderEditable]'s bounds, above or diff --git a/packages/flutter/lib/src/rendering/error.dart b/packages/flutter/lib/src/rendering/error.dart index ee7806faee..e9be76f231 100644 --- a/packages/flutter/lib/src/rendering/error.dart +++ b/packages/flutter/lib/src/rendering/error.dart @@ -4,6 +4,8 @@ import 'dart:ui' as ui show Paragraph, ParagraphBuilder, ParagraphConstraints, ParagraphStyle, TextStyle; +import 'package:flutter/foundation.dart'; + import 'box.dart'; import 'object.dart'; @@ -77,7 +79,8 @@ class RenderErrorBox extends RenderBox { bool hitTestSelf(Offset position) => true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.constrain(const Size(_kMaxWidth, _kMaxHeight)); } diff --git a/packages/flutter/lib/src/rendering/flex.dart b/packages/flutter/lib/src/rendering/flex.dart index da12a9cd94..9c6887ee38 100644 --- a/packages/flutter/lib/src/rendering/flex.dart +++ b/packages/flutter/lib/src/rendering/flex.dart @@ -653,7 +653,8 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _sizeForConstraints(constraints); } diff --git a/packages/flutter/lib/src/rendering/list_body.dart b/packages/flutter/lib/src/rendering/list_body.dart index 2b924633b4..97f961a156 100644 --- a/packages/flutter/lib/src/rendering/list_body.dart +++ b/packages/flutter/lib/src/rendering/list_body.dart @@ -4,6 +4,8 @@ import 'dart:math' as math; +import 'package:flutter/foundation.dart'; + import 'box.dart'; import 'object.dart'; @@ -62,7 +64,8 @@ class RenderListBody extends RenderBox Axis get mainAxis => axisDirectionToAxis(axisDirection); @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { assert(_debugCheckConstraints(constraints)); double mainAxisExtent = 0.0; RenderBox? child = firstChild; diff --git a/packages/flutter/lib/src/rendering/list_wheel_viewport.dart b/packages/flutter/lib/src/rendering/list_wheel_viewport.dart index c66e97e3e5..785423bfc7 100644 --- a/packages/flutter/lib/src/rendering/list_wheel_viewport.dart +++ b/packages/flutter/lib/src/rendering/list_wheel_viewport.dart @@ -5,6 +5,7 @@ import 'dart:math' as math; import 'package:flutter/animation.dart'; +import 'package:flutter/foundation.dart'; import 'package:vector_math/vector_math_64.dart' show Matrix4; import 'box.dart'; @@ -615,7 +616,8 @@ class RenderListWheelViewport bool get sizedByParent => true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.biggest; } diff --git a/packages/flutter/lib/src/rendering/paragraph.dart b/packages/flutter/lib/src/rendering/paragraph.dart index 9ac2d9a499..97638029c1 100644 --- a/packages/flutter/lib/src/rendering/paragraph.dart +++ b/packages/flutter/lib/src/rendering/paragraph.dart @@ -772,7 +772,8 @@ class RenderParagraph extends RenderBox with ContainerRenderObjectMixin true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.biggest; } @@ -319,7 +320,8 @@ abstract class RenderDarwinPlatformView _UiKitViewGestureRecognizer? _gestureRecognizer; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.biggest; } @@ -711,7 +713,8 @@ class PlatformViewRenderBox extends RenderBox with _PlatformViewGestureMixin { bool get isRepaintBoundary => true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.biggest; } diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 31d3aad4a1..c6f1f0c900 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -95,7 +95,8 @@ mixin RenderProxyBoxMixin on RenderBox, RenderObjectWithChi } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return child?.getDryLayout(constraints) ?? computeSizeForNoChild(constraints); } @@ -284,7 +285,8 @@ class RenderConstrainedBox extends RenderProxyBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (child != null) { return child!.getDryLayout(_additionalConstraints.enforce(constraints)); } else { @@ -383,7 +385,8 @@ class RenderLimitedBox extends RenderProxyBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _computeSize( constraints: constraints, layoutChild: ChildLayoutHelper.dryLayoutChild, @@ -565,7 +568,8 @@ class RenderAspectRatio extends RenderProxyBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _applyAspectRatio(constraints); } @@ -726,7 +730,8 @@ class RenderIntrinsicWidth extends RenderProxyBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _computeSize( layoutChild: ChildLayoutHelper.dryLayoutChild, constraints: constraints, @@ -826,7 +831,8 @@ class RenderIntrinsicHeight extends RenderProxyBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _computeSize( layoutChild: ChildLayoutHelper.dryLayoutChild, constraints: constraints, @@ -2672,7 +2678,8 @@ class RenderFittedBox extends RenderProxyBox { // TODO(ianh): The intrinsic dimensions of this box are wrong. @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (child != null) { final Size childSize = child!.getDryLayout(const BoxConstraints()); @@ -3693,7 +3700,8 @@ class RenderOffstage extends RenderProxyBox { bool get sizedByParent => offstage; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (offstage) { return constraints.smallest; } diff --git a/packages/flutter/lib/src/rendering/rotated_box.dart b/packages/flutter/lib/src/rendering/rotated_box.dart index 89cf6aafc4..8a7d14e3ec 100644 --- a/packages/flutter/lib/src/rendering/rotated_box.dart +++ b/packages/flutter/lib/src/rendering/rotated_box.dart @@ -4,6 +4,7 @@ import 'dart:math' as math; +import 'package:flutter/foundation.dart'; import 'package:vector_math/vector_math_64.dart'; import 'box.dart'; @@ -74,7 +75,8 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.biggest; } @@ -772,7 +775,8 @@ class RenderConstraintsTransformBox extends RenderAligningShiftedBox with DebugO } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { final Size? childSize = child?.getDryLayout(constraintsTransform(constraints)); return childSize == null ? constraints.smallest : constraints.constrain(childSize); } @@ -940,7 +944,8 @@ class RenderSizedOverflowBox extends RenderAligningShiftedBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.constrain(_requestedSize); } @@ -1089,7 +1094,8 @@ class RenderFractionallySizedOverflowBox extends RenderAligningShiftedBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (child != null) { final Size childSize = child!.getDryLayout(_getInnerConstraints(constraints)); return constraints.constrain(childSize); @@ -1288,7 +1294,8 @@ class RenderCustomSingleChildLayoutBox extends RenderShiftedBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _getSize(constraints); } @@ -1355,7 +1362,8 @@ class RenderBaseline extends RenderShiftedBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (child != null) { assert(debugCannotComputeDryLayout( reason: 'Baseline metrics are only available after a full layout.', diff --git a/packages/flutter/lib/src/rendering/stack.dart b/packages/flutter/lib/src/rendering/stack.dart index 5fe64c47b7..b17b620cb1 100644 --- a/packages/flutter/lib/src/rendering/stack.dart +++ b/packages/flutter/lib/src/rendering/stack.dart @@ -547,7 +547,8 @@ class RenderStack extends RenderBox } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _computeSize( constraints: constraints, layoutChild: ChildLayoutHelper.dryLayoutChild, diff --git a/packages/flutter/lib/src/rendering/table.dart b/packages/flutter/lib/src/rendering/table.dart index 2aa4658c3b..85d936023d 100644 --- a/packages/flutter/lib/src/rendering/table.dart +++ b/packages/flutter/lib/src/rendering/table.dart @@ -1024,7 +1024,8 @@ class RenderTable extends RenderBox { } @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { if (rows * columns == 0) { return constraints.constrain(Size.zero); } diff --git a/packages/flutter/lib/src/rendering/texture.dart b/packages/flutter/lib/src/rendering/texture.dart index fcbaaa3ed0..9016cb87ab 100644 --- a/packages/flutter/lib/src/rendering/texture.dart +++ b/packages/flutter/lib/src/rendering/texture.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/foundation.dart'; + import 'box.dart'; import 'layer.dart'; import 'object.dart'; @@ -84,7 +86,8 @@ class TextureBox extends RenderBox { bool get isRepaintBoundary => true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return constraints.biggest; } diff --git a/packages/flutter/lib/src/rendering/viewport.dart b/packages/flutter/lib/src/rendering/viewport.dart index 8756c8fe63..3bfd1dbcbe 100644 --- a/packages/flutter/lib/src/rendering/viewport.dart +++ b/packages/flutter/lib/src/rendering/viewport.dart @@ -1411,7 +1411,8 @@ class RenderViewport extends RenderViewportBase true; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { assert(debugCheckHasBoundedAxis(axis, constraints)); return constraints.biggest; } diff --git a/packages/flutter/lib/src/rendering/wrap.dart b/packages/flutter/lib/src/rendering/wrap.dart index d651add2c5..b6589150e8 100644 --- a/packages/flutter/lib/src/rendering/wrap.dart +++ b/packages/flutter/lib/src/rendering/wrap.dart @@ -4,6 +4,8 @@ import 'dart:math' as math; +import 'package:flutter/foundation.dart'; + import 'box.dart'; import 'layer.dart'; import 'layout_helper.dart'; @@ -493,7 +495,8 @@ class RenderWrap extends RenderBox bool _hasVisualOverflow = false; @override - Size computeDryLayout(BoxConstraints constraints) { + @protected + Size computeDryLayout(covariant BoxConstraints constraints) { return _computeDryLayout(constraints); } diff --git a/packages/flutter/test/rendering/editable_test.dart b/packages/flutter/test/rendering/editable_test.dart index c980447eaf..fb44017859 100644 --- a/packages/flutter/test/rendering/editable_test.dart +++ b/packages/flutter/test/rendering/editable_test.dart @@ -1825,11 +1825,13 @@ void main() { ); layout(editable, constraints: constraints); + // ignore: invalid_use_of_protected_member final double initialWidth = editable.computeDryLayout(constraints).width; expect(initialWidth, 500); // Turn off forceLine. Now the width should be significantly smaller. editable.forceLine = false; + // ignore: invalid_use_of_protected_member expect(editable.computeDryLayout(constraints).width, lessThan(initialWidth)); }); diff --git a/packages/flutter/test/rendering/proxy_box_test.dart b/packages/flutter/test/rendering/proxy_box_test.dart index 4dfa6c2b9b..12f7a2729b 100644 --- a/packages/flutter/test/rendering/proxy_box_test.dart +++ b/packages/flutter/test/rendering/proxy_box_test.dart @@ -961,10 +961,17 @@ void main() { expect(fancyProxyBox.fancyMethod(), 36); // Box has behavior from RenderProxyBox: expect( + // ignore: invalid_use_of_protected_member fancyProxyBox.computeDryLayout(const BoxConstraints(minHeight: 8)), const Size(0, 8), ); }); + + test('computeDryLayout constraints are covariant', () { + final RenderBoxWithTestConstraints box = RenderBoxWithTestConstraints(); + const TestConstraints constraints = TestConstraints(testValue: 6); + expect(box.computeDryLayout(constraints), const Size.square(6)); + }); } class _TestRectClipper extends CustomClipper { @@ -1087,3 +1094,19 @@ void expectAssertionError() { } typedef DebugPaintCallback = void Function(PaintingContext context, Offset offset); + +class TestConstraints extends BoxConstraints { + const TestConstraints({ + double extent = 100, + required this.testValue, + }) : super(maxWidth: extent, maxHeight: extent); + + final double testValue; +} + +class RenderBoxWithTestConstraints extends RenderProxyBox { + @override + Size computeDryLayout(TestConstraints constraints) { + return constraints.constrain(Size.square(constraints.testValue)); + } +}