Error message when size has not been set in RenderBox's performLayout should be well versed (#58151)
diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart
index 0416e4c..a30442c 100644
--- a/packages/flutter/lib/src/rendering/box.dart
+++ b/packages/flutter/lib/src/rendering/box.dart
@@ -1927,7 +1927,6 @@
assert(constraints != null);
assert(() {
if (!hasSize) {
- assert(!debugNeedsLayout); // this is called in the size= setter during layout, but in that case we have a size
DiagnosticsNode contract;
if (sizedByParent)
contract = ErrorDescription('Because this RenderBox has sizedByParent set to true, it must set its size in performResize().');
diff --git a/packages/flutter/test/rendering/box_test.dart b/packages/flutter/test/rendering/box_test.dart
index 495d969..bb4acbe 100644
--- a/packages/flutter/test/rendering/box_test.dart
+++ b/packages/flutter/test/rendering/box_test.dart
@@ -2,6 +2,7 @@
// 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 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
@@ -30,6 +31,11 @@
bool fakeMissingSize = false;
}
+class MissingSetSizeRenderBox extends RenderBox {
+ @override
+ void performLayout() { }
+}
+
void main() {
test('should size to render view', () {
final RenderBox root = RenderDecoratedBox(
@@ -1014,6 +1020,34 @@
expect(() => BoxConstraints(minHeight: null), throwsAssertionError);
expect(() => BoxConstraints(maxHeight: null), throwsAssertionError);
});
+
+ test('Error message when size has not been set in RenderBox performLayout should be well versed', () {
+ FlutterErrorDetails errorDetails;
+ final FlutterExceptionHandler oldHandler = FlutterError.onError;
+ FlutterError.onError = (FlutterErrorDetails details) {
+ errorDetails = details;
+ };
+ try {
+ MissingSetSizeRenderBox().layout(const BoxConstraints());
+ } finally {
+ FlutterError.onError = oldHandler;
+ }
+
+ expect(errorDetails, isNotNull);
+
+ // Check the ErrorDetails without the stack trace.
+ final List<String> lines = errorDetails.toString().split('\n');
+ expect(
+ lines.take(5).join('\n'),
+ equalsIgnoringHashCodes(
+ '══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞══════════════════════\n'
+ 'The following assertion was thrown during performLayout():\n'
+ 'RenderBox did not set its size during layout.\n'
+ 'Because this RenderBox has sizedByParent set to false, it must\n'
+ 'set its size in performLayout().'
+ ),
+ );
+ });
}
class _DummyHitTestTarget implements HitTestTarget {