Avoid null check operator failure in RenderFlex._hasOverflow (#72122)
Fixes https://github.com/flutter/flutter/issues/71972
This commit is contained in:
parent
bb0e6ce9b0
commit
e2a0d03b79
@ -483,10 +483,10 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set during layout if overflow occurred on the main axis.
|
// 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
|
// Check whether any meaningful overflow is present. Values below an epsilon
|
||||||
// are treated as not overflowing.
|
// are treated as not overflowing.
|
||||||
bool get _hasOverflow => _overflow! > precisionErrorTolerance;
|
bool get _hasOverflow => _overflow > precisionErrorTolerance;
|
||||||
|
|
||||||
/// {@macro flutter.material.Material.clipBehavior}
|
/// {@macro flutter.material.Material.clipBehavior}
|
||||||
///
|
///
|
||||||
@ -1125,10 +1125,10 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
|
|||||||
final Rect overflowChildRect;
|
final Rect overflowChildRect;
|
||||||
switch (_direction) {
|
switch (_direction) {
|
||||||
case Axis.horizontal:
|
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;
|
break;
|
||||||
case Axis.vertical:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
paintOverflowIndicator(context, offset, Offset.zero & size, overflowChildRect, overflowHints: debugOverflowHints);
|
paintOverflowIndicator(context, offset, Offset.zero & size, overflowChildRect, overflowHints: debugOverflowHints);
|
||||||
@ -1144,7 +1144,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
|
|||||||
@override
|
@override
|
||||||
String toStringShort() {
|
String toStringShort() {
|
||||||
String header = super.toStringShort();
|
String header = super.toStringShort();
|
||||||
if (_overflow != null && _hasOverflow)
|
if (_hasOverflow)
|
||||||
header += ' OVERFLOWING';
|
header += ' OVERFLOWING';
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
@ -632,4 +632,20 @@ void main() {
|
|||||||
expect(() => flex.getMaxIntrinsicWidth(100), cannotCalculateIntrinsics);
|
expect(() => flex.getMaxIntrinsicWidth(100), cannotCalculateIntrinsics);
|
||||||
expect(() => flex.getMinIntrinsicWidth(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')));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user