Avoid null check operator failure in RenderFlex._hasOverflow (#72122)

Fixes https://github.com/flutter/flutter/issues/71972
This commit is contained in:
Todd Volkert 2020-12-17 19:25:28 -08:00 committed by GitHub
parent bb0e6ce9b0
commit e2a0d03b79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 5 deletions

View File

@ -483,10 +483,10 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
}
// Set during layout if overflow occurred on the main axis.
double? _overflow;
double _overflow = 0;
// Check whether any meaningful overflow is present. Values below an epsilon
// are treated as not overflowing.
bool get _hasOverflow => _overflow! > precisionErrorTolerance;
bool get _hasOverflow => _overflow > precisionErrorTolerance;
/// {@macro flutter.material.Material.clipBehavior}
///
@ -1125,10 +1125,10 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
final Rect overflowChildRect;
switch (_direction) {
case Axis.horizontal:
overflowChildRect = Rect.fromLTWH(0.0, 0.0, size.width + _overflow!, 0.0);
overflowChildRect = Rect.fromLTWH(0.0, 0.0, size.width + _overflow, 0.0);
break;
case Axis.vertical:
overflowChildRect = Rect.fromLTWH(0.0, 0.0, 0.0, size.height + _overflow!);
overflowChildRect = Rect.fromLTWH(0.0, 0.0, 0.0, size.height + _overflow);
break;
}
paintOverflowIndicator(context, offset, Offset.zero & size, overflowChildRect, overflowHints: debugOverflowHints);
@ -1144,7 +1144,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
@override
String toStringShort() {
String header = super.toStringShort();
if (_overflow != null && _hasOverflow)
if (_hasOverflow)
header += ' OVERFLOWING';
return header;
}

View File

@ -632,4 +632,20 @@ void main() {
expect(() => flex.getMaxIntrinsicWidth(100), cannotCalculateIntrinsics);
expect(() => flex.getMinIntrinsicWidth(100), cannotCalculateIntrinsics);
});
test('Can call methods that check overflow even if overflow value is not set', () {
final List<dynamic> exceptions = <dynamic>[];
final RenderFlex flex = RenderFlex(children: const <RenderBox>[]);
// This forces a check for _hasOverflow
expect(flex.toStringShort(), isNot(contains('OVERFLOWING')));
layout(flex, phase: EnginePhase.paint, onErrors: () {
exceptions.addAll(renderer.takeAllFlutterExceptions());
});
// We expect the RenderFlex to throw during performLayout() for not having
// a text direction, thus leaving it with a null overflow value. It'll then
// try to paint(), which also checks _hasOverflow, and it should be able to
// do so without an ancillary error.
expect(exceptions, hasLength(1));
expect(exceptions.first.message, isNot(contains('Null check operator')));
});
}