Unverified Commit e71eb183 authored by Pierre-Louis's avatar Pierre-Louis Committed by GitHub

Use `curly_braces_in_flow_control_structures` for `rendering` (#104611)

* Use `curly_braces_in_flow_control_structures` for `rendering`

* fix comments

* fix dangling
parent b0aa5025
...@@ -94,8 +94,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { ...@@ -94,8 +94,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox {
duration: duration, duration: duration,
reverseDuration: reverseDuration, reverseDuration: reverseDuration,
)..addListener(() { )..addListener(() {
if (_controller.value != _lastValue) if (_controller.value != _lastValue) {
markNeedsLayout(); markNeedsLayout();
}
}); });
_animation = CurvedAnimation( _animation = CurvedAnimation(
parent: _controller, parent: _controller,
...@@ -120,16 +121,18 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { ...@@ -120,16 +121,18 @@ class RenderAnimatedSize extends RenderAligningShiftedBox {
Duration get duration => _controller.duration!; Duration get duration => _controller.duration!;
set duration(Duration value) { set duration(Duration value) {
assert(value != null); assert(value != null);
if (value == _controller.duration) if (value == _controller.duration) {
return; return;
}
_controller.duration = value; _controller.duration = value;
} }
/// The duration of the animation when running in reverse. /// The duration of the animation when running in reverse.
Duration? get reverseDuration => _controller.reverseDuration; Duration? get reverseDuration => _controller.reverseDuration;
set reverseDuration(Duration? value) { set reverseDuration(Duration? value) {
if (value == _controller.reverseDuration) if (value == _controller.reverseDuration) {
return; return;
}
_controller.reverseDuration = value; _controller.reverseDuration = value;
} }
...@@ -137,8 +140,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { ...@@ -137,8 +140,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox {
Curve get curve => _animation.curve; Curve get curve => _animation.curve;
set curve(Curve value) { set curve(Curve value) {
assert(value != null); assert(value != null);
if (value == _animation.curve) if (value == _animation.curve) {
return; return;
}
_animation.curve = value; _animation.curve = value;
} }
...@@ -167,8 +171,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { ...@@ -167,8 +171,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox {
TickerProvider _vsync; TickerProvider _vsync;
set vsync(TickerProvider value) { set vsync(TickerProvider value) {
assert(value != null); assert(value != null);
if (value == _vsync) if (value == _vsync) {
return; return;
}
_vsync = value; _vsync = value;
_controller.resync(vsync); _controller.resync(vsync);
} }
...@@ -234,8 +239,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { ...@@ -234,8 +239,9 @@ class RenderAnimatedSize extends RenderAligningShiftedBox {
alignChild(); alignChild();
if (size.width < _sizeTween.end!.width || if (size.width < _sizeTween.end!.width ||
size.height < _sizeTween.end!.height) size.height < _sizeTween.end!.height) {
_hasVisualOverflow = true; _hasVisualOverflow = true;
}
} }
@override @override
...@@ -318,8 +324,10 @@ class RenderAnimatedSize extends RenderAligningShiftedBox { ...@@ -318,8 +324,10 @@ class RenderAnimatedSize extends RenderAligningShiftedBox {
} else { } else {
// Child size stabilized. // Child size stabilized.
_state = RenderAnimatedSizeState.stable; _state = RenderAnimatedSizeState.stable;
if (!_controller.isAnimating) if (!_controller.isAnimating) {
_controller.forward(); // resume the animation after being detached // Resume the animation after being detached.
_controller.forward();
}
} }
} }
......
...@@ -77,8 +77,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -77,8 +77,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
name: 'debugPaint', name: 'debugPaint',
getter: () async => debugPaintSizeEnabled, getter: () async => debugPaintSizeEnabled,
setter: (bool value) { setter: (bool value) {
if (debugPaintSizeEnabled == value) if (debugPaintSizeEnabled == value) {
return Future<void>.value(); return Future<void>.value();
}
debugPaintSizeEnabled = value; debugPaintSizeEnabled = value;
return _forceRepaint(); return _forceRepaint();
}, },
...@@ -87,8 +88,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -87,8 +88,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
name: 'debugPaintBaselinesEnabled', name: 'debugPaintBaselinesEnabled',
getter: () async => debugPaintBaselinesEnabled, getter: () async => debugPaintBaselinesEnabled,
setter: (bool value) { setter: (bool value) {
if (debugPaintBaselinesEnabled == value) if (debugPaintBaselinesEnabled == value) {
return Future<void>.value(); return Future<void>.value();
}
debugPaintBaselinesEnabled = value; debugPaintBaselinesEnabled = value;
return _forceRepaint(); return _forceRepaint();
}, },
...@@ -99,8 +101,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -99,8 +101,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
setter: (bool value) { setter: (bool value) {
final bool repaint = debugRepaintRainbowEnabled && !value; final bool repaint = debugRepaintRainbowEnabled && !value;
debugRepaintRainbowEnabled = value; debugRepaintRainbowEnabled = value;
if (repaint) if (repaint) {
return _forceRepaint(); return _forceRepaint();
}
return Future<void>.value(); return Future<void>.value();
}, },
); );
...@@ -117,8 +120,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -117,8 +120,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
name: 'debugDisableClipLayers', name: 'debugDisableClipLayers',
getter: () async => debugDisableClipLayers, getter: () async => debugDisableClipLayers,
setter: (bool value) { setter: (bool value) {
if (debugDisableClipLayers == value) if (debugDisableClipLayers == value) {
return Future<void>.value(); return Future<void>.value();
}
debugDisableClipLayers = value; debugDisableClipLayers = value;
return _forceRepaint(); return _forceRepaint();
}, },
...@@ -127,8 +131,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -127,8 +131,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
name: 'debugDisablePhysicalShapeLayers', name: 'debugDisablePhysicalShapeLayers',
getter: () async => debugDisablePhysicalShapeLayers, getter: () async => debugDisablePhysicalShapeLayers,
setter: (bool value) { setter: (bool value) {
if (debugDisablePhysicalShapeLayers == value) if (debugDisablePhysicalShapeLayers == value) {
return Future<void>.value(); return Future<void>.value();
}
debugDisablePhysicalShapeLayers = value; debugDisablePhysicalShapeLayers = value;
return _forceRepaint(); return _forceRepaint();
}, },
...@@ -137,8 +142,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -137,8 +142,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
name: 'debugDisableOpacityLayers', name: 'debugDisableOpacityLayers',
getter: () async => debugDisableOpacityLayers, getter: () async => debugDisableOpacityLayers,
setter: (bool value) { setter: (bool value) {
if (debugDisableOpacityLayers == value) if (debugDisableOpacityLayers == value) {
return Future<void>.value(); return Future<void>.value();
}
debugDisableOpacityLayers = value; debugDisableOpacityLayers = value;
return _forceRepaint(); return _forceRepaint();
}, },
...@@ -181,16 +187,18 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -181,16 +187,18 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
name: 'profileRenderObjectPaints', name: 'profileRenderObjectPaints',
getter: () async => debugProfilePaintsEnabled, getter: () async => debugProfilePaintsEnabled,
setter: (bool value) async { setter: (bool value) async {
if (debugProfilePaintsEnabled != value) if (debugProfilePaintsEnabled != value) {
debugProfilePaintsEnabled = value; debugProfilePaintsEnabled = value;
}
}, },
); );
registerBoolServiceExtension( registerBoolServiceExtension(
name: 'profileRenderObjectLayouts', name: 'profileRenderObjectLayouts',
getter: () async => debugProfileLayoutsEnabled, getter: () async => debugProfileLayoutsEnabled,
setter: (bool value) async { setter: (bool value) async {
if (debugProfileLayoutsEnabled != value) if (debugProfileLayoutsEnabled != value) {
debugProfileLayoutsEnabled = value; debugProfileLayoutsEnabled = value;
}
}, },
); );
} }
...@@ -431,8 +439,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture ...@@ -431,8 +439,9 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture
// Always schedule a warm up frame even if the deferral count is not down to // Always schedule a warm up frame even if the deferral count is not down to
// zero yet since the removal of a deferral may uncover new deferrals that // zero yet since the removal of a deferral may uncover new deferrals that
// are lower in the widget tree. // are lower in the widget tree.
if (!_firstFrameSent) if (!_firstFrameSent) {
scheduleWarmUpFrame(); scheduleWarmUpFrame();
}
} }
/// Call this to pretend that no frames have been sent to the engine yet. /// Call this to pretend that no frames have been sent to the engine yet.
...@@ -610,8 +619,9 @@ class RenderingFlutterBinding extends BindingBase with GestureBinding, Scheduler ...@@ -610,8 +619,9 @@ class RenderingFlutterBinding extends BindingBase with GestureBinding, Scheduler
/// if you are using it directly. If you are using the widgets framework, /// if you are using it directly. If you are using the widgets framework,
/// see [WidgetsFlutterBinding.ensureInitialized]. /// see [WidgetsFlutterBinding.ensureInitialized].
static RendererBinding ensureInitialized() { static RendererBinding ensureInitialized() {
if (RendererBinding._instance == null) if (RendererBinding._instance == null) {
RenderingFlutterBinding(); RenderingFlutterBinding();
}
return RendererBinding.instance; return RendererBinding.instance;
} }
} }
This diff is collapsed.
...@@ -318,8 +318,9 @@ class RenderCustomMultiChildLayoutBox extends RenderBox ...@@ -318,8 +318,9 @@ class RenderCustomMultiChildLayoutBox extends RenderBox
@override @override
void setupParentData(RenderBox child) { void setupParentData(RenderBox child) {
if (child.parentData is! MultiChildLayoutParentData) if (child.parentData is! MultiChildLayoutParentData) {
child.parentData = MultiChildLayoutParentData(); child.parentData = MultiChildLayoutParentData();
}
} }
/// The delegate that controls the layout of the children. /// The delegate that controls the layout of the children.
...@@ -327,11 +328,13 @@ class RenderCustomMultiChildLayoutBox extends RenderBox ...@@ -327,11 +328,13 @@ class RenderCustomMultiChildLayoutBox extends RenderBox
MultiChildLayoutDelegate _delegate; MultiChildLayoutDelegate _delegate;
set delegate(MultiChildLayoutDelegate newDelegate) { set delegate(MultiChildLayoutDelegate newDelegate) {
assert(newDelegate != null); assert(newDelegate != null);
if (_delegate == newDelegate) if (_delegate == newDelegate) {
return; return;
}
final MultiChildLayoutDelegate oldDelegate = _delegate; final MultiChildLayoutDelegate oldDelegate = _delegate;
if (newDelegate.runtimeType != oldDelegate.runtimeType || newDelegate.shouldRelayout(oldDelegate)) if (newDelegate.runtimeType != oldDelegate.runtimeType || newDelegate.shouldRelayout(oldDelegate)) {
markNeedsLayout(); markNeedsLayout();
}
_delegate = newDelegate; _delegate = newDelegate;
if (attached) { if (attached) {
oldDelegate._relayout?.removeListener(markNeedsLayout); oldDelegate._relayout?.removeListener(markNeedsLayout);
...@@ -363,32 +366,36 @@ class RenderCustomMultiChildLayoutBox extends RenderBox ...@@ -363,32 +366,36 @@ class RenderCustomMultiChildLayoutBox extends RenderBox
@override @override
double computeMinIntrinsicWidth(double height) { double computeMinIntrinsicWidth(double height) {
final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width; final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width;
if (width.isFinite) if (width.isFinite) {
return width; return width;
}
return 0.0; return 0.0;
} }
@override @override
double computeMaxIntrinsicWidth(double height) { double computeMaxIntrinsicWidth(double height) {
final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width; final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width;
if (width.isFinite) if (width.isFinite) {
return width; return width;
}
return 0.0; return 0.0;
} }
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height; final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height;
if (height.isFinite) if (height.isFinite) {
return height; return height;
}
return 0.0; return 0.0;
} }
@override @override
double computeMaxIntrinsicHeight(double width) { double computeMaxIntrinsicHeight(double width) {
final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height; final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height;
if (height.isFinite) if (height.isFinite) {
return height; return height;
}
return 0.0; return 0.0;
} }
......
...@@ -397,8 +397,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -397,8 +397,9 @@ class RenderCustomPaint extends RenderProxyBox {
/// ///
/// If the new value is null, then there is no background custom painter. /// If the new value is null, then there is no background custom painter.
set painter(CustomPainter? value) { set painter(CustomPainter? value) {
if (_painter == value) if (_painter == value) {
return; return;
}
final CustomPainter? oldPainter = _painter; final CustomPainter? oldPainter = _painter;
_painter = value; _painter = value;
_didUpdatePainter(_painter, oldPainter); _didUpdatePainter(_painter, oldPainter);
...@@ -422,8 +423,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -422,8 +423,9 @@ class RenderCustomPaint extends RenderProxyBox {
/// ///
/// If the new value is null, then there is no foreground custom painter. /// If the new value is null, then there is no foreground custom painter.
set foregroundPainter(CustomPainter? value) { set foregroundPainter(CustomPainter? value) {
if (_foregroundPainter == value) if (_foregroundPainter == value) {
return; return;
}
final CustomPainter? oldPainter = _foregroundPainter; final CustomPainter? oldPainter = _foregroundPainter;
_foregroundPainter = value; _foregroundPainter = value;
_didUpdatePainter(_foregroundPainter, oldPainter); _didUpdatePainter(_foregroundPainter, oldPainter);
...@@ -447,8 +449,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -447,8 +449,9 @@ class RenderCustomPaint extends RenderProxyBox {
// Check if we need to rebuild semantics. // Check if we need to rebuild semantics.
if (newPainter == null) { if (newPainter == null) {
assert(oldPainter != null); // We should be called only for changes. assert(oldPainter != null); // We should be called only for changes.
if (attached) if (attached) {
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
}
} else if (oldPainter == null || } else if (oldPainter == null ||
newPainter.runtimeType != oldPainter.runtimeType || newPainter.runtimeType != oldPainter.runtimeType ||
newPainter.shouldRebuildSemantics(oldPainter)) { newPainter.shouldRebuildSemantics(oldPainter)) {
...@@ -467,8 +470,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -467,8 +470,9 @@ class RenderCustomPaint extends RenderProxyBox {
Size _preferredSize; Size _preferredSize;
set preferredSize(Size value) { set preferredSize(Size value) {
assert(value != null); assert(value != null);
if (preferredSize == value) if (preferredSize == value) {
return; return;
}
_preferredSize = value; _preferredSize = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -488,29 +492,33 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -488,29 +492,33 @@ class RenderCustomPaint extends RenderProxyBox {
@override @override
double computeMinIntrinsicWidth(double height) { double computeMinIntrinsicWidth(double height) {
if (child == null) if (child == null) {
return preferredSize.width.isFinite ? preferredSize.width : 0; return preferredSize.width.isFinite ? preferredSize.width : 0;
}
return super.computeMinIntrinsicWidth(height); return super.computeMinIntrinsicWidth(height);
} }
@override @override
double computeMaxIntrinsicWidth(double height) { double computeMaxIntrinsicWidth(double height) {
if (child == null) if (child == null) {
return preferredSize.width.isFinite ? preferredSize.width : 0; return preferredSize.width.isFinite ? preferredSize.width : 0;
}
return super.computeMaxIntrinsicWidth(height); return super.computeMaxIntrinsicWidth(height);
} }
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
if (child == null) if (child == null) {
return preferredSize.height.isFinite ? preferredSize.height : 0; return preferredSize.height.isFinite ? preferredSize.height : 0;
}
return super.computeMinIntrinsicHeight(width); return super.computeMinIntrinsicHeight(width);
} }
@override @override
double computeMaxIntrinsicHeight(double width) { double computeMaxIntrinsicHeight(double width) {
if (child == null) if (child == null) {
return preferredSize.height.isFinite ? preferredSize.height : 0; return preferredSize.height.isFinite ? preferredSize.height : 0;
}
return super.computeMaxIntrinsicHeight(width); return super.computeMaxIntrinsicHeight(width);
} }
...@@ -530,8 +538,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -530,8 +538,9 @@ class RenderCustomPaint extends RenderProxyBox {
@override @override
bool hitTestChildren(BoxHitTestResult result, { required Offset position }) { bool hitTestChildren(BoxHitTestResult result, { required Offset position }) {
if (_foregroundPainter != null && (_foregroundPainter!.hitTest(position) ?? false)) if (_foregroundPainter != null && (_foregroundPainter!.hitTest(position) ?? false)) {
return true; return true;
}
return super.hitTestChildren(result, position: position); return super.hitTestChildren(result, position: position);
} }
...@@ -558,8 +567,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -558,8 +567,9 @@ class RenderCustomPaint extends RenderProxyBox {
debugPreviousCanvasSaveCount = canvas.getSaveCount(); debugPreviousCanvasSaveCount = canvas.getSaveCount();
return true; return true;
}()); }());
if (offset != Offset.zero) if (offset != Offset.zero) {
canvas.translate(offset.dx, offset.dy); canvas.translate(offset.dx, offset.dy);
}
painter.paint(canvas, size); painter.paint(canvas, size);
assert(() { assert(() {
// This isn't perfect. For example, we can't catch the case of // This isn't perfect. For example, we can't catch the case of
...@@ -613,10 +623,12 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -613,10 +623,12 @@ class RenderCustomPaint extends RenderProxyBox {
} }
void _setRasterCacheHints(PaintingContext context) { void _setRasterCacheHints(PaintingContext context) {
if (isComplex) if (isComplex) {
context.setIsComplexHint(); context.setIsComplexHint();
if (willChange) }
if (willChange) {
context.setWillChangeHint(); context.setWillChangeHint();
}
} }
/// Builds semantics for the picture drawn by [painter]. /// Builds semantics for the picture drawn by [painter].
...@@ -745,8 +757,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -745,8 +757,9 @@ class RenderCustomPaint extends RenderProxyBox {
while ((oldChildrenTop <= oldChildrenBottom) && (newChildrenTop <= newChildrenBottom)) { while ((oldChildrenTop <= oldChildrenBottom) && (newChildrenTop <= newChildrenBottom)) {
final SemanticsNode oldChild = oldSemantics[oldChildrenTop]; final SemanticsNode oldChild = oldSemantics[oldChildrenTop];
final CustomPainterSemantics newSemantics = newChildSemantics[newChildrenTop]; final CustomPainterSemantics newSemantics = newChildSemantics[newChildrenTop];
if (!_canUpdateSemanticsChild(oldChild, newSemantics)) if (!_canUpdateSemanticsChild(oldChild, newSemantics)) {
break; break;
}
final SemanticsNode newChild = _updateSemanticsChild(oldChild, newSemantics); final SemanticsNode newChild = _updateSemanticsChild(oldChild, newSemantics);
newChildren[newChildrenTop] = newChild; newChildren[newChildrenTop] = newChild;
newChildrenTop += 1; newChildrenTop += 1;
...@@ -757,8 +770,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -757,8 +770,9 @@ class RenderCustomPaint extends RenderProxyBox {
while ((oldChildrenTop <= oldChildrenBottom) && (newChildrenTop <= newChildrenBottom)) { while ((oldChildrenTop <= oldChildrenBottom) && (newChildrenTop <= newChildrenBottom)) {
final SemanticsNode oldChild = oldSemantics[oldChildrenBottom]; final SemanticsNode oldChild = oldSemantics[oldChildrenBottom];
final CustomPainterSemantics newChild = newChildSemantics[newChildrenBottom]; final CustomPainterSemantics newChild = newChildSemantics[newChildrenBottom];
if (!_canUpdateSemanticsChild(oldChild, newChild)) if (!_canUpdateSemanticsChild(oldChild, newChild)) {
break; break;
}
oldChildrenBottom -= 1; oldChildrenBottom -= 1;
newChildrenBottom -= 1; newChildrenBottom -= 1;
} }
...@@ -770,8 +784,9 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -770,8 +784,9 @@ class RenderCustomPaint extends RenderProxyBox {
oldKeyedChildren = <Key, SemanticsNode>{}; oldKeyedChildren = <Key, SemanticsNode>{};
while (oldChildrenTop <= oldChildrenBottom) { while (oldChildrenTop <= oldChildrenBottom) {
final SemanticsNode oldChild = oldSemantics[oldChildrenTop]; final SemanticsNode oldChild = oldSemantics[oldChildrenTop];
if (oldChild.key != null) if (oldChild.key != null) {
oldKeyedChildren[oldChild.key!] = oldChild; oldKeyedChildren[oldChild.key!] = oldChild;
}
oldChildrenTop += 1; oldChildrenTop += 1;
} }
} }
......
...@@ -504,8 +504,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -504,8 +504,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
@override @override
void setupParentData(RenderBox child) { void setupParentData(RenderBox child) {
if (child.parentData is! FlexParentData) if (child.parentData is! FlexParentData) {
child.parentData = FlexParentData(); child.parentData = FlexParentData();
}
} }
bool get _canComputeIntrinsics => crossAxisAlignment != CrossAxisAlignment.baseline; bool get _canComputeIntrinsics => crossAxisAlignment != CrossAxisAlignment.baseline;
...@@ -589,8 +590,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -589,8 +590,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
child = firstChild; child = firstChild;
while (child != null) { while (child != null) {
final int flex = _getFlex(child); final int flex = _getFlex(child);
if (flex > 0) if (flex > 0) {
maxCrossSize = math.max(maxCrossSize, childSize(child, spacePerFlex * flex)); maxCrossSize = math.max(maxCrossSize, childSize(child, spacePerFlex * flex));
}
final FlexParentData childParentData = child.parentData! as FlexParentData; final FlexParentData childParentData = child.parentData! as FlexParentData;
child = childParentData.nextSibling; child = childParentData.nextSibling;
} }
...@@ -637,8 +639,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -637,8 +639,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
@override @override
double? computeDistanceToActualBaseline(TextBaseline baseline) { double? computeDistanceToActualBaseline(TextBaseline baseline) {
if (_direction == Axis.horizontal) if (_direction == Axis.horizontal) {
return defaultComputeDistanceToHighestActualBaseline(baseline); return defaultComputeDistanceToHighestActualBaseline(baseline);
}
return defaultComputeDistanceToFirstActualBaseline(baseline); return defaultComputeDistanceToFirstActualBaseline(baseline);
} }
...@@ -730,16 +733,20 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -730,16 +733,20 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
RenderBox? node = this; RenderBox? node = this;
switch (_direction) { switch (_direction) {
case Axis.horizontal: case Axis.horizontal:
while (!node!.constraints.hasBoundedWidth && node.parent is RenderBox) while (!node!.constraints.hasBoundedWidth && node.parent is RenderBox) {
node = node.parent! as RenderBox; node = node.parent! as RenderBox;
if (!node.constraints.hasBoundedWidth) }
if (!node.constraints.hasBoundedWidth) {
node = null; node = null;
}
break; break;
case Axis.vertical: case Axis.vertical:
while (!node!.constraints.hasBoundedHeight && node.parent is RenderBox) while (!node!.constraints.hasBoundedHeight && node.parent is RenderBox) {
node = node.parent! as RenderBox; node = node.parent! as RenderBox;
if (!node.constraints.hasBoundedHeight) }
if (!node.constraints.hasBoundedHeight) {
node = null; node = null;
}
break; break;
} }
if (node != null) { if (node != null) {
...@@ -943,8 +950,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -943,8 +950,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
double maxSizeBelowBaseline = 0; double maxSizeBelowBaseline = 0;
while (child != null) { while (child != null) {
assert(() { assert(() {
if (textBaseline == null) if (textBaseline == null) {
throw FlutterError('To use FlexAlignItems.baseline, you must also specify which baseline to use using the "baseline" argument.'); throw FlutterError('To use FlexAlignItems.baseline, you must also specify which baseline to use using the "baseline" argument.');
}
return true; return true;
}()); }());
final double? distance = child.getDistanceToBaseline(textBaseline!, onlyReal: true); final double? distance = child.getDistanceToBaseline(textBaseline!, onlyReal: true);
...@@ -1039,17 +1047,19 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -1039,17 +1047,19 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
if (_direction == Axis.horizontal) { if (_direction == Axis.horizontal) {
assert(textBaseline != null); assert(textBaseline != null);
final double? distance = child.getDistanceToBaseline(textBaseline!, onlyReal: true); final double? distance = child.getDistanceToBaseline(textBaseline!, onlyReal: true);
if (distance != null) if (distance != null) {
childCrossPosition = maxBaselineDistance - distance; childCrossPosition = maxBaselineDistance - distance;
else } else {
childCrossPosition = 0.0; childCrossPosition = 0.0;
}
} else { } else {
childCrossPosition = 0.0; childCrossPosition = 0.0;
} }
break; break;
} }
if (flipMainAxis) if (flipMainAxis) {
childMainPosition -= _getMainSize(child.size); childMainPosition -= _getMainSize(child.size);
}
switch (_direction) { switch (_direction) {
case Axis.horizontal: case Axis.horizontal:
childParentData.offset = Offset(childMainPosition, childCrossPosition); childParentData.offset = Offset(childMainPosition, childCrossPosition);
...@@ -1080,8 +1090,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -1080,8 +1090,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
} }
// There's no point in drawing the children if we're empty. // There's no point in drawing the children if we're empty.
if (size.isEmpty) if (size.isEmpty) {
return; return;
}
_clipRectLayer.layer = context.pushClipRect( _clipRectLayer.layer = context.pushClipRect(
needsCompositing, needsCompositing,
...@@ -1160,8 +1171,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -1160,8 +1171,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
String toStringShort() { String toStringShort() {
String header = super.toStringShort(); String header = super.toStringShort();
if (!kReleaseMode) { if (!kReleaseMode) {
if (_hasOverflow) if (_hasOverflow) {
header += ' OVERFLOWING'; header += ' OVERFLOWING';
}
} }
return header; return header;
} }
......
...@@ -193,10 +193,11 @@ class RenderFlow extends RenderBox ...@@ -193,10 +193,11 @@ class RenderFlow extends RenderBox
@override @override
void setupParentData(RenderBox child) { void setupParentData(RenderBox child) {
final ParentData? childParentData = child.parentData; final ParentData? childParentData = child.parentData;
if (childParentData is FlowParentData) if (childParentData is FlowParentData) {
childParentData._transform = null; childParentData._transform = null;
else } else {
child.parentData = FlowParentData(); child.parentData = FlowParentData();
}
} }
/// The delegate that controls the transformation matrices of the children. /// The delegate that controls the transformation matrices of the children.
...@@ -209,15 +210,17 @@ class RenderFlow extends RenderBox ...@@ -209,15 +210,17 @@ class RenderFlow extends RenderBox
/// layout or painting. /// layout or painting.
set delegate(FlowDelegate newDelegate) { set delegate(FlowDelegate newDelegate) {
assert(newDelegate != null); assert(newDelegate != null);
if (_delegate == newDelegate) if (_delegate == newDelegate) {
return; return;
}
final FlowDelegate oldDelegate = _delegate; final FlowDelegate oldDelegate = _delegate;
_delegate = newDelegate; _delegate = newDelegate;
if (newDelegate.runtimeType != oldDelegate.runtimeType || newDelegate.shouldRelayout(oldDelegate)) if (newDelegate.runtimeType != oldDelegate.runtimeType || newDelegate.shouldRelayout(oldDelegate)) {
markNeedsLayout(); markNeedsLayout();
else if (newDelegate.shouldRepaint(oldDelegate)) } else if (newDelegate.shouldRepaint(oldDelegate)) {
markNeedsPaint(); markNeedsPaint();
}
if (attached) { if (attached) {
oldDelegate._repaint?.removeListener(markNeedsPaint); oldDelegate._repaint?.removeListener(markNeedsPaint);
...@@ -266,32 +269,36 @@ class RenderFlow extends RenderBox ...@@ -266,32 +269,36 @@ class RenderFlow extends RenderBox
@override @override
double computeMinIntrinsicWidth(double height) { double computeMinIntrinsicWidth(double height) {
final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width; final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width;
if (width.isFinite) if (width.isFinite) {
return width; return width;
}
return 0.0; return 0.0;
} }
@override @override
double computeMaxIntrinsicWidth(double height) { double computeMaxIntrinsicWidth(double height) {
final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width; final double width = _getSize(BoxConstraints.tightForFinite(height: height)).width;
if (width.isFinite) if (width.isFinite) {
return width; return width;
}
return 0.0; return 0.0;
} }
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height; final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height;
if (height.isFinite) if (height.isFinite) {
return height; return height;
}
return 0.0; return 0.0;
} }
@override @override
double computeMaxIntrinsicHeight(double width) { double computeMaxIntrinsicHeight(double width) {
final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height; final double height = _getSize(BoxConstraints.tightForFinite(width: width)).height;
if (height.isFinite) if (height.isFinite) {
return height; return height;
}
return 0.0; return 0.0;
} }
...@@ -330,8 +337,9 @@ class RenderFlow extends RenderBox ...@@ -330,8 +337,9 @@ class RenderFlow extends RenderBox
@override @override
Size? getChildSize(int i) { Size? getChildSize(int i) {
if (i < 0 || i >= _randomAccessChildren.length) if (i < 0 || i >= _randomAccessChildren.length) {
return null; return null;
}
return _randomAccessChildren[i].size; return _randomAccessChildren[i].size;
} }
...@@ -355,8 +363,9 @@ class RenderFlow extends RenderBox ...@@ -355,8 +363,9 @@ class RenderFlow extends RenderBox
// We return after assigning _transform so that the transparent child can // We return after assigning _transform so that the transparent child can
// still be hit tested at the correct location. // still be hit tested at the correct location.
if (opacity == 0.0) if (opacity == 0.0) {
return; return;
}
void painter(PaintingContext context, Offset offset) { void painter(PaintingContext context, Offset offset) {
context.paintChild(child, offset); context.paintChild(child, offset);
...@@ -411,13 +420,15 @@ class RenderFlow extends RenderBox ...@@ -411,13 +420,15 @@ class RenderFlow extends RenderBox
final List<RenderBox> children = getChildrenAsList(); final List<RenderBox> children = getChildrenAsList();
for (int i = _lastPaintOrder.length - 1; i >= 0; --i) { for (int i = _lastPaintOrder.length - 1; i >= 0; --i) {
final int childIndex = _lastPaintOrder[i]; final int childIndex = _lastPaintOrder[i];
if (childIndex >= children.length) if (childIndex >= children.length) {
continue; continue;
}
final RenderBox child = children[childIndex]; final RenderBox child = children[childIndex];
final FlowParentData childParentData = child.parentData! as FlowParentData; final FlowParentData childParentData = child.parentData! as FlowParentData;
final Matrix4? transform = childParentData._transform; final Matrix4? transform = childParentData._transform;
if (transform == null) if (transform == null) {
continue; continue;
}
final bool absorbed = result.addWithPaintTransform( final bool absorbed = result.addWithPaintTransform(
transform: transform, transform: transform,
position: position, position: position,
...@@ -425,8 +436,9 @@ class RenderFlow extends RenderBox ...@@ -425,8 +436,9 @@ class RenderFlow extends RenderBox
return child.hitTest(result, position: position); return child.hitTest(result, position: position);
}, },
); );
if (absorbed) if (absorbed) {
return true; return true;
}
} }
return false; return false;
} }
...@@ -434,8 +446,9 @@ class RenderFlow extends RenderBox ...@@ -434,8 +446,9 @@ class RenderFlow extends RenderBox
@override @override
void applyPaintTransform(RenderBox child, Matrix4 transform) { void applyPaintTransform(RenderBox child, Matrix4 transform) {
final FlowParentData childParentData = child.parentData! as FlowParentData; final FlowParentData childParentData = child.parentData! as FlowParentData;
if (childParentData._transform != null) if (childParentData._transform != null) {
transform.multiply(childParentData._transform!); transform.multiply(childParentData._transform!);
}
super.applyPaintTransform(child, transform); super.applyPaintTransform(child, transform);
} }
} }
...@@ -73,8 +73,9 @@ class RenderImage extends RenderBox { ...@@ -73,8 +73,9 @@ class RenderImage extends RenderBox {
bool? _flipHorizontally; bool? _flipHorizontally;
void _resolve() { void _resolve() {
if (_resolvedAlignment != null) if (_resolvedAlignment != null) {
return; return;
}
_resolvedAlignment = alignment.resolve(textDirection); _resolvedAlignment = alignment.resolve(textDirection);
_flipHorizontally = matchTextDirection && textDirection == TextDirection.rtl; _flipHorizontally = matchTextDirection && textDirection == TextDirection.rtl;
} }
...@@ -101,8 +102,9 @@ class RenderImage extends RenderBox { ...@@ -101,8 +102,9 @@ class RenderImage extends RenderBox {
_image?.dispose(); _image?.dispose();
_image = value; _image = value;
markNeedsPaint(); markNeedsPaint();
if (_width == null || _height == null) if (_width == null || _height == null) {
markNeedsLayout(); markNeedsLayout();
}
} }
/// A string used to identify the source of the image. /// A string used to identify the source of the image.
...@@ -115,8 +117,9 @@ class RenderImage extends RenderBox { ...@@ -115,8 +117,9 @@ class RenderImage extends RenderBox {
double? get width => _width; double? get width => _width;
double? _width; double? _width;
set width(double? value) { set width(double? value) {
if (value == _width) if (value == _width) {
return; return;
}
_width = value; _width = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -128,8 +131,9 @@ class RenderImage extends RenderBox { ...@@ -128,8 +131,9 @@ class RenderImage extends RenderBox {
double? get height => _height; double? get height => _height;
double? _height; double? _height;
set height(double? value) { set height(double? value) {
if (value == _height) if (value == _height) {
return; return;
}
_height = value; _height = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -141,8 +145,9 @@ class RenderImage extends RenderBox { ...@@ -141,8 +145,9 @@ class RenderImage extends RenderBox {
double _scale; double _scale;
set scale(double value) { set scale(double value) {
assert(value != null); assert(value != null);
if (value == _scale) if (value == _scale) {
return; return;
}
_scale = value; _scale = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -150,18 +155,20 @@ class RenderImage extends RenderBox { ...@@ -150,18 +155,20 @@ class RenderImage extends RenderBox {
ColorFilter? _colorFilter; ColorFilter? _colorFilter;
void _updateColorFilter() { void _updateColorFilter() {
if (_color == null) if (_color == null) {
_colorFilter = null; _colorFilter = null;
else } else {
_colorFilter = ColorFilter.mode(_color!, _colorBlendMode ?? BlendMode.srcIn); _colorFilter = ColorFilter.mode(_color!, _colorBlendMode ?? BlendMode.srcIn);
}
} }
/// If non-null, this color is blended with each image pixel using [colorBlendMode]. /// If non-null, this color is blended with each image pixel using [colorBlendMode].
Color? get color => _color; Color? get color => _color;
Color? _color; Color? _color;
set color(Color? value) { set color(Color? value) {
if (value == _color) if (value == _color) {
return; return;
}
_color = value; _color = value;
_updateColorFilter(); _updateColorFilter();
markNeedsPaint(); markNeedsPaint();
...@@ -172,14 +179,17 @@ class RenderImage extends RenderBox { ...@@ -172,14 +179,17 @@ class RenderImage extends RenderBox {
Animation<double>? get opacity => _opacity; Animation<double>? get opacity => _opacity;
Animation<double>? _opacity; Animation<double>? _opacity;
set opacity(Animation<double>? value) { set opacity(Animation<double>? value) {
if (value == _opacity) if (value == _opacity) {
return; return;
}
if (attached) if (attached) {
_opacity?.removeListener(markNeedsPaint); _opacity?.removeListener(markNeedsPaint);
}
_opacity = value; _opacity = value;
if (attached) if (attached) {
value?.addListener(markNeedsPaint); value?.addListener(markNeedsPaint);
}
} }
/// Used to set the filterQuality of the image. /// Used to set the filterQuality of the image.
...@@ -191,8 +201,9 @@ class RenderImage extends RenderBox { ...@@ -191,8 +201,9 @@ class RenderImage extends RenderBox {
FilterQuality _filterQuality; FilterQuality _filterQuality;
set filterQuality(FilterQuality value) { set filterQuality(FilterQuality value) {
assert(value != null); assert(value != null);
if (value == _filterQuality) if (value == _filterQuality) {
return; return;
}
_filterQuality = value; _filterQuality = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -209,8 +220,9 @@ class RenderImage extends RenderBox { ...@@ -209,8 +220,9 @@ class RenderImage extends RenderBox {
BlendMode? get colorBlendMode => _colorBlendMode; BlendMode? get colorBlendMode => _colorBlendMode;
BlendMode? _colorBlendMode; BlendMode? _colorBlendMode;
set colorBlendMode(BlendMode? value) { set colorBlendMode(BlendMode? value) {
if (value == _colorBlendMode) if (value == _colorBlendMode) {
return; return;
}
_colorBlendMode = value; _colorBlendMode = value;
_updateColorFilter(); _updateColorFilter();
markNeedsPaint(); markNeedsPaint();
...@@ -223,8 +235,9 @@ class RenderImage extends RenderBox { ...@@ -223,8 +235,9 @@ class RenderImage extends RenderBox {
BoxFit? get fit => _fit; BoxFit? get fit => _fit;
BoxFit? _fit; BoxFit? _fit;
set fit(BoxFit? value) { set fit(BoxFit? value) {
if (value == _fit) if (value == _fit) {
return; return;
}
_fit = value; _fit = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -237,8 +250,9 @@ class RenderImage extends RenderBox { ...@@ -237,8 +250,9 @@ class RenderImage extends RenderBox {
AlignmentGeometry _alignment; AlignmentGeometry _alignment;
set alignment(AlignmentGeometry value) { set alignment(AlignmentGeometry value) {
assert(value != null); assert(value != null);
if (value == _alignment) if (value == _alignment) {
return; return;
}
_alignment = value; _alignment = value;
_markNeedResolution(); _markNeedResolution();
} }
...@@ -248,8 +262,9 @@ class RenderImage extends RenderBox { ...@@ -248,8 +262,9 @@ class RenderImage extends RenderBox {
ImageRepeat _repeat; ImageRepeat _repeat;
set repeat(ImageRepeat value) { set repeat(ImageRepeat value) {
assert(value != null); assert(value != null);
if (value == _repeat) if (value == _repeat) {
return; return;
}
_repeat = value; _repeat = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -264,8 +279,9 @@ class RenderImage extends RenderBox { ...@@ -264,8 +279,9 @@ class RenderImage extends RenderBox {
Rect? get centerSlice => _centerSlice; Rect? get centerSlice => _centerSlice;
Rect? _centerSlice; Rect? _centerSlice;
set centerSlice(Rect? value) { set centerSlice(Rect? value) {
if (value == _centerSlice) if (value == _centerSlice) {
return; return;
}
_centerSlice = value; _centerSlice = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -278,8 +294,9 @@ class RenderImage extends RenderBox { ...@@ -278,8 +294,9 @@ class RenderImage extends RenderBox {
bool get invertColors => _invertColors; bool get invertColors => _invertColors;
bool _invertColors; bool _invertColors;
set invertColors(bool value) { set invertColors(bool value) {
if (value == _invertColors) if (value == _invertColors) {
return; return;
}
_invertColors = value; _invertColors = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -302,8 +319,9 @@ class RenderImage extends RenderBox { ...@@ -302,8 +319,9 @@ class RenderImage extends RenderBox {
bool _matchTextDirection; bool _matchTextDirection;
set matchTextDirection(bool value) { set matchTextDirection(bool value) {
assert(value != null); assert(value != null);
if (value == _matchTextDirection) if (value == _matchTextDirection) {
return; return;
}
_matchTextDirection = value; _matchTextDirection = value;
_markNeedResolution(); _markNeedResolution();
} }
...@@ -316,8 +334,9 @@ class RenderImage extends RenderBox { ...@@ -316,8 +334,9 @@ class RenderImage extends RenderBox {
TextDirection? get textDirection => _textDirection; TextDirection? get textDirection => _textDirection;
TextDirection? _textDirection; TextDirection? _textDirection;
set textDirection(TextDirection? value) { set textDirection(TextDirection? value) {
if (_textDirection == value) if (_textDirection == value) {
return; return;
}
_textDirection = value; _textDirection = value;
_markNeedResolution(); _markNeedResolution();
} }
...@@ -351,8 +370,9 @@ class RenderImage extends RenderBox { ...@@ -351,8 +370,9 @@ class RenderImage extends RenderBox {
height: _height, height: _height,
).enforce(constraints); ).enforce(constraints);
if (_image == null) if (_image == null) {
return constraints.smallest; return constraints.smallest;
}
return constraints.constrainSizeAndAttemptToPreserveAspectRatio(Size( return constraints.constrainSizeAndAttemptToPreserveAspectRatio(Size(
_image!.width.toDouble() / _scale, _image!.width.toDouble() / _scale,
...@@ -363,8 +383,9 @@ class RenderImage extends RenderBox { ...@@ -363,8 +383,9 @@ class RenderImage extends RenderBox {
@override @override
double computeMinIntrinsicWidth(double height) { double computeMinIntrinsicWidth(double height) {
assert(height >= 0.0); assert(height >= 0.0);
if (_width == null && _height == null) if (_width == null && _height == null) {
return 0.0; return 0.0;
}
return _sizeForConstraints(BoxConstraints.tightForFinite(height: height)).width; return _sizeForConstraints(BoxConstraints.tightForFinite(height: height)).width;
} }
...@@ -377,8 +398,9 @@ class RenderImage extends RenderBox { ...@@ -377,8 +398,9 @@ class RenderImage extends RenderBox {
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
assert(width >= 0.0); assert(width >= 0.0);
if (_width == null && _height == null) if (_width == null && _height == null) {
return 0.0; return 0.0;
}
return _sizeForConstraints(BoxConstraints.tightForFinite(width: width)).height; return _sizeForConstraints(BoxConstraints.tightForFinite(width: width)).height;
} }
...@@ -415,8 +437,9 @@ class RenderImage extends RenderBox { ...@@ -415,8 +437,9 @@ class RenderImage extends RenderBox {
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (_image == null) if (_image == null) {
return; return;
}
_resolve(); _resolve();
assert(_resolvedAlignment != null); assert(_resolvedAlignment != null);
assert(_flipHorizontally != null); assert(_flipHorizontally != null);
......
...@@ -1105,10 +1105,12 @@ class ContainerLayer extends Layer { ...@@ -1105,10 +1105,12 @@ class ContainerLayer extends Layer {
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
for (Layer? child = lastChild; child != null; child = child.previousSibling) { for (Layer? child = lastChild; child != null; child = child.previousSibling) {
final bool isAbsorbed = child.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst); final bool isAbsorbed = child.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst);
if (isAbsorbed) if (isAbsorbed) {
return true; return true;
if (onlyFirst && result.entries.isNotEmpty) }
if (onlyFirst && result.entries.isNotEmpty) {
return isAbsorbed; return isAbsorbed;
}
} }
return false; return false;
} }
...@@ -1155,15 +1157,17 @@ class ContainerLayer extends Layer { ...@@ -1155,15 +1157,17 @@ class ContainerLayer extends Layer {
assert(child._parentHandle.layer == null); assert(child._parentHandle.layer == null);
assert(() { assert(() {
Layer node = this; Layer node = this;
while (node.parent != null) while (node.parent != null) {
node = node.parent!; node = node.parent!;
}
assert(node != child); // indicates we are about to create a cycle assert(node != child); // indicates we are about to create a cycle
return true; return true;
}()); }());
adoptChild(child); adoptChild(child);
child._previousSibling = lastChild; child._previousSibling = lastChild;
if (lastChild != null) if (lastChild != null) {
lastChild!._nextSibling = child; lastChild!._nextSibling = child;
}
_lastChild = child; _lastChild = child;
_firstChild ??= child; _firstChild ??= child;
child._parentHandle.layer = child; child._parentHandle.layer = child;
...@@ -1280,8 +1284,9 @@ class ContainerLayer extends Layer { ...@@ -1280,8 +1284,9 @@ class ContainerLayer extends Layer {
/// Returns the descendants of this layer in depth first order. /// Returns the descendants of this layer in depth first order.
@visibleForTesting @visibleForTesting
List<Layer> depthFirstIterateChildren() { List<Layer> depthFirstIterateChildren() {
if (firstChild == null) if (firstChild == null) {
return <Layer>[]; return <Layer>[];
}
final List<Layer> children = <Layer>[]; final List<Layer> children = <Layer>[];
Layer? child = firstChild; Layer? child = firstChild;
while(child != null) { while(child != null) {
...@@ -1297,14 +1302,16 @@ class ContainerLayer extends Layer { ...@@ -1297,14 +1302,16 @@ class ContainerLayer extends Layer {
@override @override
List<DiagnosticsNode> debugDescribeChildren() { List<DiagnosticsNode> debugDescribeChildren() {
final List<DiagnosticsNode> children = <DiagnosticsNode>[]; final List<DiagnosticsNode> children = <DiagnosticsNode>[];
if (firstChild == null) if (firstChild == null) {
return children; return children;
}
Layer? child = firstChild; Layer? child = firstChild;
int count = 1; int count = 1;
while (true) { while (true) {
children.add(child!.toDiagnosticsNode(name: 'child $count')); children.add(child!.toDiagnosticsNode(name: 'child $count'));
if (child == lastChild) if (child == lastChild) {
break; break;
}
count += 1; count += 1;
child = child.nextSibling; child = child.nextSibling;
} }
...@@ -1476,8 +1483,9 @@ class ClipRectLayer extends ContainerLayer { ...@@ -1476,8 +1483,9 @@ class ClipRectLayer extends ContainerLayer {
@override @override
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
if (!clipRect!.contains(localPosition)) if (!clipRect!.contains(localPosition)) {
return false; return false;
}
return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst); return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst);
} }
...@@ -1500,8 +1508,9 @@ class ClipRectLayer extends ContainerLayer { ...@@ -1500,8 +1508,9 @@ class ClipRectLayer extends ContainerLayer {
engineLayer = null; engineLayer = null;
} }
addChildrenToScene(builder); addChildrenToScene(builder);
if (enabled) if (enabled) {
builder.pop(); builder.pop();
}
} }
@override @override
...@@ -1562,8 +1571,9 @@ class ClipRRectLayer extends ContainerLayer { ...@@ -1562,8 +1571,9 @@ class ClipRRectLayer extends ContainerLayer {
@override @override
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
if (!clipRRect!.contains(localPosition)) if (!clipRRect!.contains(localPosition)) {
return false; return false;
}
return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst); return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst);
} }
...@@ -1586,8 +1596,9 @@ class ClipRRectLayer extends ContainerLayer { ...@@ -1586,8 +1596,9 @@ class ClipRRectLayer extends ContainerLayer {
engineLayer = null; engineLayer = null;
} }
addChildrenToScene(builder); addChildrenToScene(builder);
if (enabled) if (enabled) {
builder.pop(); builder.pop();
}
} }
@override @override
...@@ -1648,8 +1659,9 @@ class ClipPathLayer extends ContainerLayer { ...@@ -1648,8 +1659,9 @@ class ClipPathLayer extends ContainerLayer {
@override @override
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
if (!clipPath!.contains(localPosition)) if (!clipPath!.contains(localPosition)) {
return false; return false;
}
return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst); return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst);
} }
...@@ -1672,8 +1684,9 @@ class ClipPathLayer extends ContainerLayer { ...@@ -1672,8 +1684,9 @@ class ClipPathLayer extends ContainerLayer {
engineLayer = null; engineLayer = null;
} }
addChildrenToScene(builder); addChildrenToScene(builder);
if (enabled) if (enabled) {
builder.pop(); builder.pop();
}
} }
@override @override
...@@ -1794,8 +1807,9 @@ class TransformLayer extends OffsetLayer { ...@@ -1794,8 +1807,9 @@ class TransformLayer extends OffsetLayer {
set transform(Matrix4? value) { set transform(Matrix4? value) {
assert(value != null); assert(value != null);
assert(value!.storage.every((double component) => component.isFinite)); assert(value!.storage.every((double component) => component.isFinite));
if (value == _transform) if (value == _transform) {
return; return;
}
_transform = value; _transform = value;
_inverseDirty = true; _inverseDirty = true;
markNeedsAddToScene(); markNeedsAddToScene();
...@@ -1828,8 +1842,9 @@ class TransformLayer extends OffsetLayer { ...@@ -1828,8 +1842,9 @@ class TransformLayer extends OffsetLayer {
); );
_inverseDirty = false; _inverseDirty = false;
} }
if (_invertedTransform == null) if (_invertedTransform == null) {
return null; return null;
}
return MatrixUtils.transformPoint(_invertedTransform!, localPosition); return MatrixUtils.transformPoint(_invertedTransform!, localPosition);
} }
...@@ -1837,8 +1852,9 @@ class TransformLayer extends OffsetLayer { ...@@ -1837,8 +1852,9 @@ class TransformLayer extends OffsetLayer {
@override @override
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
final Offset? transformedOffset = _transformOffset(localPosition); final Offset? transformedOffset = _transformOffset(localPosition);
if (transformedOffset == null) if (transformedOffset == null) {
return false; return false;
}
return super.findAnnotations<S>(result, transformedOffset, onlyFirst: onlyFirst); return super.findAnnotations<S>(result, transformedOffset, onlyFirst: onlyFirst);
} }
...@@ -2206,8 +2222,9 @@ class PhysicalModelLayer extends ContainerLayer { ...@@ -2206,8 +2222,9 @@ class PhysicalModelLayer extends ContainerLayer {
@override @override
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
if (!clipPath!.contains(localPosition)) if (!clipPath!.contains(localPosition)) {
return false; return false;
}
return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst); return super.findAnnotations<S>(result, localPosition, onlyFirst: onlyFirst);
} }
...@@ -2237,8 +2254,9 @@ class PhysicalModelLayer extends ContainerLayer { ...@@ -2237,8 +2254,9 @@ class PhysicalModelLayer extends ContainerLayer {
engineLayer = null; engineLayer = null;
} }
addChildrenToScene(builder); addChildrenToScene(builder);
if (enabled) if (enabled) {
builder.pop(); builder.pop();
}
} }
@override @override
...@@ -2300,8 +2318,9 @@ class LayerLink { ...@@ -2300,8 +2318,9 @@ class LayerLink {
void _debugScheduleLeadersCleanUpCheck() { void _debugScheduleLeadersCleanUpCheck() {
assert(_debugPreviousLeaders != null); assert(_debugPreviousLeaders != null);
assert(() { assert(() {
if (_debugLeaderCheckScheduled) if (_debugLeaderCheckScheduled) {
return true; return true;
}
_debugLeaderCheckScheduled = true; _debugLeaderCheckScheduled = true;
SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) { SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) {
_debugLeaderCheckScheduled = false; _debugLeaderCheckScheduled = false;
...@@ -2397,14 +2416,16 @@ class LeaderLayer extends ContainerLayer { ...@@ -2397,14 +2416,16 @@ class LeaderLayer extends ContainerLayer {
@override @override
void addToScene(ui.SceneBuilder builder) { void addToScene(ui.SceneBuilder builder) {
assert(offset != null); assert(offset != null);
if (offset != Offset.zero) if (offset != Offset.zero) {
engineLayer = builder.pushTransform( engineLayer = builder.pushTransform(
Matrix4.translationValues(offset.dx, offset.dy, 0.0).storage, Matrix4.translationValues(offset.dx, offset.dy, 0.0).storage,
oldLayer: _engineLayer as ui.TransformEngineLayer?, oldLayer: _engineLayer as ui.TransformEngineLayer?,
); );
}
addChildrenToScene(builder); addChildrenToScene(builder);
if (offset != Offset.zero) if (offset != Offset.zero) {
builder.pop(); builder.pop();
}
} }
/// Applies the transform that would be applied when compositing the given /// Applies the transform that would be applied when compositing the given
...@@ -2416,8 +2437,9 @@ class LeaderLayer extends ContainerLayer { ...@@ -2416,8 +2437,9 @@ class LeaderLayer extends ContainerLayer {
/// children. /// children.
@override @override
void applyTransform(Layer? child, Matrix4 transform) { void applyTransform(Layer? child, Matrix4 transform) {
if (offset != Offset.zero) if (offset != Offset.zero) {
transform.translate(offset.dx, offset.dy); transform.translate(offset.dx, offset.dy);
}
} }
@override @override
...@@ -2516,8 +2538,9 @@ class FollowerLayer extends ContainerLayer { ...@@ -2516,8 +2538,9 @@ class FollowerLayer extends ContainerLayer {
_invertedTransform = Matrix4.tryInvert(getLastTransform()!); _invertedTransform = Matrix4.tryInvert(getLastTransform()!);
_inverseDirty = false; _inverseDirty = false;
} }
if (_invertedTransform == null) if (_invertedTransform == null) {
return null; return null;
}
final Vector4 vector = Vector4(localPosition.dx, localPosition.dy, 0.0, 1.0); final Vector4 vector = Vector4(localPosition.dx, localPosition.dy, 0.0, 1.0);
final Vector4 result = _invertedTransform!.transform(vector); final Vector4 result = _invertedTransform!.transform(vector);
return Offset(result[0] - linkedOffset!.dx, result[1] - linkedOffset!.dy); return Offset(result[0] - linkedOffset!.dx, result[1] - linkedOffset!.dy);
...@@ -2545,8 +2568,9 @@ class FollowerLayer extends ContainerLayer { ...@@ -2545,8 +2568,9 @@ class FollowerLayer extends ContainerLayer {
/// ///
/// This method returns a new [Matrix4] instance each time it is invoked. /// This method returns a new [Matrix4] instance each time it is invoked.
Matrix4? getLastTransform() { Matrix4? getLastTransform() {
if (_lastTransform == null) if (_lastTransform == null) {
return null; return null;
}
final Matrix4 result = Matrix4.translationValues(-_lastOffset!.dx, -_lastOffset!.dy, 0.0); final Matrix4 result = Matrix4.translationValues(-_lastOffset!.dx, -_lastOffset!.dy, 0.0);
result.multiply(_lastTransform!); result.multiply(_lastTransform!);
return result; return result;
...@@ -2563,8 +2587,9 @@ class FollowerLayer extends ContainerLayer { ...@@ -2563,8 +2587,9 @@ class FollowerLayer extends ContainerLayer {
final Matrix4 result = Matrix4.identity(); final Matrix4 result = Matrix4.identity();
// Apply each layer to the matrix in turn, starting from the last layer, // Apply each layer to the matrix in turn, starting from the last layer,
// and providing the previous layer as the child. // and providing the previous layer as the child.
for (int index = layers.length - 1; index > 0; index -= 1) for (int index = layers.length - 1; index > 0; index -= 1) {
layers[index]?.applyTransform(layers[index - 1], result); layers[index]?.applyTransform(layers[index - 1], result);
}
return result; return result;
} }
...@@ -2581,11 +2606,13 @@ class FollowerLayer extends ContainerLayer { ...@@ -2581,11 +2606,13 @@ class FollowerLayer extends ContainerLayer {
List<ContainerLayer?> ancestorsB, List<ContainerLayer?> ancestorsB,
) { ) {
// No common ancestor found. // No common ancestor found.
if (a == null || b == null) if (a == null || b == null) {
return null; return null;
}
if (identical(a, b)) if (identical(a, b)) {
return a; return a;
}
if (a.depth < b.depth) { if (a.depth < b.depth) {
ancestorsB.add(b.parent); ancestorsB.add(b.parent);
...@@ -2634,8 +2661,9 @@ class FollowerLayer extends ContainerLayer { ...@@ -2634,8 +2661,9 @@ class FollowerLayer extends ContainerLayer {
_lastTransform = null; _lastTransform = null;
final LeaderLayer? leader = _link.leader; final LeaderLayer? leader = _link.leader;
// Check to see if we are linked. // Check to see if we are linked.
if (leader == null) if (leader == null) {
return; return;
}
// If we're linked, check the link is valid. // If we're linked, check the link is valid.
assert( assert(
leader.owner == owner, leader.owner == owner,
...@@ -2849,8 +2877,9 @@ class AnnotatedRegionLayer<T extends Object> extends ContainerLayer { ...@@ -2849,8 +2877,9 @@ class AnnotatedRegionLayer<T extends Object> extends ContainerLayer {
@override @override
bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) { bool findAnnotations<S extends Object>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
bool isAbsorbed = super.findAnnotations(result, localPosition, onlyFirst: onlyFirst); bool isAbsorbed = super.findAnnotations(result, localPosition, onlyFirst: onlyFirst);
if (result.entries.isNotEmpty && onlyFirst) if (result.entries.isNotEmpty && onlyFirst) {
return isAbsorbed; return isAbsorbed;
}
if (size != null && !(offset & size!).contains(localPosition)) { if (size != null && !(offset & size!).contains(localPosition)) {
return isAbsorbed; return isAbsorbed;
} }
......
...@@ -39,8 +39,9 @@ class RenderListBody extends RenderBox ...@@ -39,8 +39,9 @@ class RenderListBody extends RenderBox
@override @override
void setupParentData(RenderBox child) { void setupParentData(RenderBox child) {
if (child.parentData is! ListBodyParentData) if (child.parentData is! ListBodyParentData) {
child.parentData = ListBodyParentData(); child.parentData = ListBodyParentData();
}
} }
/// The direction in which the children are laid out. /// The direction in which the children are laid out.
...@@ -51,8 +52,9 @@ class RenderListBody extends RenderBox ...@@ -51,8 +52,9 @@ class RenderListBody extends RenderBox
AxisDirection _axisDirection; AxisDirection _axisDirection;
set axisDirection(AxisDirection value) { set axisDirection(AxisDirection value) {
assert(value != null); assert(value != null);
if (_axisDirection == value) if (_axisDirection == value) {
return; return;
}
_axisDirection = value; _axisDirection = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -92,12 +94,14 @@ class RenderListBody extends RenderBox ...@@ -92,12 +94,14 @@ class RenderListBody extends RenderBox
assert(() { assert(() {
switch (mainAxis) { switch (mainAxis) {
case Axis.horizontal: case Axis.horizontal:
if (!constraints.hasBoundedWidth) if (!constraints.hasBoundedWidth) {
return true; return true;
}
break; break;
case Axis.vertical: case Axis.vertical:
if (!constraints.hasBoundedHeight) if (!constraints.hasBoundedHeight) {
return true; return true;
}
break; break;
} }
throw FlutterError.fromParts(<DiagnosticsNode>[ throw FlutterError.fromParts(<DiagnosticsNode>[
...@@ -116,12 +120,14 @@ class RenderListBody extends RenderBox ...@@ -116,12 +120,14 @@ class RenderListBody extends RenderBox
assert(() { assert(() {
switch (mainAxis) { switch (mainAxis) {
case Axis.horizontal: case Axis.horizontal:
if (constraints.hasBoundedHeight) if (constraints.hasBoundedHeight) {
return true; return true;
}
break; break;
case Axis.vertical: case Axis.vertical:
if (constraints.hasBoundedWidth) if (constraints.hasBoundedWidth) {
return true; return true;
}
break; break;
} }
// TODO(ianh): Detect if we're actually nested blocks and say something // TODO(ianh): Detect if we're actually nested blocks and say something
......
...@@ -226,13 +226,16 @@ class RenderListWheelViewport ...@@ -226,13 +226,16 @@ class RenderListWheelViewport
ViewportOffset _offset; ViewportOffset _offset;
set offset(ViewportOffset value) { set offset(ViewportOffset value) {
assert(value != null); assert(value != null);
if (value == _offset) if (value == _offset) {
return; return;
if (attached) }
if (attached) {
_offset.removeListener(_hasScrolled); _offset.removeListener(_hasScrolled);
}
_offset = value; _offset = value;
if (attached) if (attached) {
_offset.addListener(_hasScrolled); _offset.addListener(_hasScrolled);
}
markNeedsLayout(); markNeedsLayout();
} }
...@@ -272,8 +275,9 @@ class RenderListWheelViewport ...@@ -272,8 +275,9 @@ class RenderListWheelViewport
value > 0, value > 0,
diameterRatioZeroMessage, diameterRatioZeroMessage,
); );
if (value == _diameterRatio) if (value == _diameterRatio) {
return; return;
}
_diameterRatio = value; _diameterRatio = value;
markNeedsPaint(); markNeedsPaint();
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
...@@ -302,8 +306,9 @@ class RenderListWheelViewport ...@@ -302,8 +306,9 @@ class RenderListWheelViewport
value <= 0.01, value <= 0.01,
perspectiveTooHighMessage, perspectiveTooHighMessage,
); );
if (value == _perspective) if (value == _perspective) {
return; return;
}
_perspective = value; _perspective = value;
markNeedsPaint(); markNeedsPaint();
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
...@@ -338,8 +343,9 @@ class RenderListWheelViewport ...@@ -338,8 +343,9 @@ class RenderListWheelViewport
double _offAxisFraction = 0.0; double _offAxisFraction = 0.0;
set offAxisFraction(double value) { set offAxisFraction(double value) {
assert(value != null); assert(value != null);
if (value == _offAxisFraction) if (value == _offAxisFraction) {
return; return;
}
_offAxisFraction = value; _offAxisFraction = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -351,8 +357,9 @@ class RenderListWheelViewport ...@@ -351,8 +357,9 @@ class RenderListWheelViewport
bool _useMagnifier = false; bool _useMagnifier = false;
set useMagnifier(bool value) { set useMagnifier(bool value) {
assert(value != null); assert(value != null);
if (value == _useMagnifier) if (value == _useMagnifier) {
return; return;
}
_useMagnifier = value; _useMagnifier = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -371,8 +378,9 @@ class RenderListWheelViewport ...@@ -371,8 +378,9 @@ class RenderListWheelViewport
set magnification(double value) { set magnification(double value) {
assert(value != null); assert(value != null);
assert(value > 0); assert(value > 0);
if (value == _magnification) if (value == _magnification) {
return; return;
}
_magnification = value; _magnification = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -390,8 +398,9 @@ class RenderListWheelViewport ...@@ -390,8 +398,9 @@ class RenderListWheelViewport
set overAndUnderCenterOpacity(double value) { set overAndUnderCenterOpacity(double value) {
assert(value != null); assert(value != null);
assert(value >= 0 && value <= 1); assert(value >= 0 && value <= 1);
if (value == _overAndUnderCenterOpacity) if (value == _overAndUnderCenterOpacity) {
return; return;
}
_overAndUnderCenterOpacity = value; _overAndUnderCenterOpacity = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -407,8 +416,9 @@ class RenderListWheelViewport ...@@ -407,8 +416,9 @@ class RenderListWheelViewport
set itemExtent(double value) { set itemExtent(double value) {
assert(value != null); assert(value != null);
assert(value > 0); assert(value > 0);
if (value == _itemExtent) if (value == _itemExtent) {
return; return;
}
_itemExtent = value; _itemExtent = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -439,8 +449,9 @@ class RenderListWheelViewport ...@@ -439,8 +449,9 @@ class RenderListWheelViewport
set squeeze(double value) { set squeeze(double value) {
assert(value != null); assert(value != null);
assert(value > 0); assert(value > 0);
if (value == _squeeze) if (value == _squeeze) {
return; return;
}
_squeeze = value; _squeeze = value;
markNeedsLayout(); markNeedsLayout();
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
...@@ -464,8 +475,9 @@ class RenderListWheelViewport ...@@ -464,8 +475,9 @@ class RenderListWheelViewport
!renderChildrenOutsideViewport || clipBehavior == Clip.none, !renderChildrenOutsideViewport || clipBehavior == Clip.none,
clipBehaviorAndRenderChildrenOutsideViewportConflict, clipBehaviorAndRenderChildrenOutsideViewportConflict,
); );
if (value == _renderChildrenOutsideViewport) if (value == _renderChildrenOutsideViewport) {
return; return;
}
_renderChildrenOutsideViewport = value; _renderChildrenOutsideViewport = value;
markNeedsLayout(); markNeedsLayout();
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
...@@ -492,8 +504,9 @@ class RenderListWheelViewport ...@@ -492,8 +504,9 @@ class RenderListWheelViewport
@override @override
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
if (child.parentData is! ListWheelParentData) if (child.parentData is! ListWheelParentData) {
child.parentData = ListWheelParentData(); child.parentData = ListWheelParentData();
}
} }
@override @override
...@@ -521,8 +534,9 @@ class RenderListWheelViewport ...@@ -521,8 +534,9 @@ class RenderListWheelViewport
/// the first item in the center. /// the first item in the center.
double get _minEstimatedScrollExtent { double get _minEstimatedScrollExtent {
assert(hasSize); assert(hasSize);
if (childManager.childCount == null) if (childManager.childCount == null) {
return double.negativeInfinity; return double.negativeInfinity;
}
return 0.0; return 0.0;
} }
...@@ -530,8 +544,9 @@ class RenderListWheelViewport ...@@ -530,8 +544,9 @@ class RenderListWheelViewport
/// the last item in the center. /// the last item in the center.
double get _maxEstimatedScrollExtent { double get _maxEstimatedScrollExtent {
assert(hasSize); assert(hasSize);
if (childManager.childCount == null) if (childManager.childCount == null) {
return double.infinity; return double.infinity;
}
return math.max(0.0, (childManager.childCount! - 1) * _itemExtent); return math.max(0.0, (childManager.childCount! - 1) * _itemExtent);
} }
...@@ -563,8 +578,9 @@ class RenderListWheelViewport ...@@ -563,8 +578,9 @@ class RenderListWheelViewport
/// When the center of children passes this angle, they are no longer painted /// When the center of children passes this angle, they are no longer painted
/// if [renderChildrenOutsideViewport] is false. /// if [renderChildrenOutsideViewport] is false.
double get _maxVisibleRadian { double get _maxVisibleRadian {
if (_diameterRatio < 1.0) if (_diameterRatio < 1.0) {
return math.pi / 2.0; return math.pi / 2.0;
}
return math.asin(1.0 / _diameterRatio); return math.asin(1.0 / _diameterRatio);
} }
...@@ -594,15 +610,17 @@ class RenderListWheelViewport ...@@ -594,15 +610,17 @@ class RenderListWheelViewport
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
if (childManager.childCount == null) if (childManager.childCount == null) {
return 0.0; return 0.0;
}
return childManager.childCount! * _itemExtent; return childManager.childCount! * _itemExtent;
} }
@override @override
double computeMaxIntrinsicHeight(double width) { double computeMaxIntrinsicHeight(double width) {
if (childManager.childCount == null) if (childManager.childCount == null) {
return 0.0; return 0.0;
}
return childManager.childCount! * _itemExtent; return childManager.childCount! * _itemExtent;
} }
...@@ -674,8 +692,9 @@ class RenderListWheelViewport ...@@ -674,8 +692,9 @@ class RenderListWheelViewport
// If renderChildrenOutsideViewport is true, we spawn extra children by // If renderChildrenOutsideViewport is true, we spawn extra children by
// doubling the visibility range, those that are in the backside of the // doubling the visibility range, those that are in the backside of the
// cylinder won't be painted anyway. // cylinder won't be painted anyway.
if (renderChildrenOutsideViewport) if (renderChildrenOutsideViewport) {
visibleHeight *= 2; visibleHeight *= 2;
}
final double firstVisibleOffset = final double firstVisibleOffset =
offset.pixels + _itemExtent / 2 - visibleHeight / 2; offset.pixels + _itemExtent / 2 - visibleHeight / 2;
...@@ -687,20 +706,24 @@ class RenderListWheelViewport ...@@ -687,20 +706,24 @@ class RenderListWheelViewport
int targetLastIndex = scrollOffsetToIndex(lastVisibleOffset); int targetLastIndex = scrollOffsetToIndex(lastVisibleOffset);
// Because we exclude lastVisibleOffset, if there's a new child starting at // Because we exclude lastVisibleOffset, if there's a new child starting at
// that offset, it is removed. // that offset, it is removed.
if (targetLastIndex * _itemExtent == lastVisibleOffset) if (targetLastIndex * _itemExtent == lastVisibleOffset) {
targetLastIndex--; targetLastIndex--;
}
// Validates the target index range. // Validates the target index range.
while (!childManager.childExistsAt(targetFirstIndex) && targetFirstIndex <= targetLastIndex) while (!childManager.childExistsAt(targetFirstIndex) && targetFirstIndex <= targetLastIndex) {
targetFirstIndex++; targetFirstIndex++;
while (!childManager.childExistsAt(targetLastIndex) && targetFirstIndex <= targetLastIndex) }
while (!childManager.childExistsAt(targetLastIndex) && targetFirstIndex <= targetLastIndex) {
targetLastIndex--; targetLastIndex--;
}
// If it turns out there's no children to layout, we remove old children and // If it turns out there's no children to layout, we remove old children and
// return. // return.
if (targetFirstIndex > targetLastIndex) { if (targetFirstIndex > targetLastIndex) {
while (firstChild != null) while (firstChild != null) {
_destroyChild(firstChild!); _destroyChild(firstChild!);
}
return; return;
} }
...@@ -715,8 +738,9 @@ class RenderListWheelViewport ...@@ -715,8 +738,9 @@ class RenderListWheelViewport
// Case when there is no intersection. // Case when there is no intersection.
if (childCount > 0 && if (childCount > 0 &&
(indexOf(firstChild!) > targetLastIndex || indexOf(lastChild!) < targetFirstIndex)) { (indexOf(firstChild!) > targetLastIndex || indexOf(lastChild!) < targetFirstIndex)) {
while (firstChild != null) while (firstChild != null) {
_destroyChild(firstChild!); _destroyChild(firstChild!);
}
} }
final BoxConstraints childConstraints = constraints.copyWith( final BoxConstraints childConstraints = constraints.copyWith(
...@@ -842,8 +866,9 @@ class RenderListWheelViewport ...@@ -842,8 +866,9 @@ class RenderListWheelViewport
// renderChildrenOutsideViewport is true. Otherwise, only children within // renderChildrenOutsideViewport is true. Otherwise, only children within
// suitable angles (via _first/lastVisibleLayoutOffset) reach the paint // suitable angles (via _first/lastVisibleLayoutOffset) reach the paint
// phase. // phase.
if (angle > math.pi / 2.0 || angle < -math.pi / 2.0) if (angle > math.pi / 2.0 || angle < -math.pi / 2.0) {
return; return;
}
final Matrix4 transform = MatrixUtils.createCylindricalProjectionTransform( final Matrix4 transform = MatrixUtils.createCylindricalProjectionTransform(
radius: size.height * _diameterRatio / 2.0, radius: size.height * _diameterRatio / 2.0,
...@@ -1038,8 +1063,9 @@ class RenderListWheelViewport ...@@ -1038,8 +1063,9 @@ class RenderListWheelViewport
// `child` will be the last RenderObject before the viewport when walking up from `target`. // `child` will be the last RenderObject before the viewport when walking up from `target`.
RenderObject child = target; RenderObject child = target;
while (child.parent != this) while (child.parent != this) {
child = child.parent! as RenderObject; child = child.parent! as RenderObject;
}
final ListWheelParentData parentData = child.parentData! as ListWheelParentData; final ListWheelParentData parentData = child.parentData! as ListWheelParentData;
final double targetOffset = parentData.offset.dy; // the so-called "centerPosition" final double targetOffset = parentData.offset.dy; // the so-called "centerPosition"
......
...@@ -193,8 +193,9 @@ class MouseTracker extends ChangeNotifier { ...@@ -193,8 +193,9 @@ class MouseTracker extends ChangeNotifier {
void _monitorMouseConnection(VoidCallback task) { void _monitorMouseConnection(VoidCallback task) {
final bool mouseWasConnected = mouseIsConnected; final bool mouseWasConnected = mouseIsConnected;
task(); task();
if (mouseWasConnected != mouseIsConnected) if (mouseWasConnected != mouseIsConnected) {
notifyListeners(); notifyListeners();
}
} }
bool _debugDuringDeviceUpdate = false; bool _debugDuringDeviceUpdate = false;
...@@ -217,8 +218,9 @@ class MouseTracker extends ChangeNotifier { ...@@ -217,8 +218,9 @@ class MouseTracker extends ChangeNotifier {
// Whether an observed event might update a device. // Whether an observed event might update a device.
static bool _shouldMarkStateDirty(_MouseState? state, PointerEvent event) { static bool _shouldMarkStateDirty(_MouseState? state, PointerEvent event) {
if (state == null) if (state == null) {
return true; return true;
}
assert(event != null); assert(event != null);
final PointerEvent lastEvent = state.latestEvent; final PointerEvent lastEvent = state.latestEvent;
assert(event.device == lastEvent.device); assert(event.device == lastEvent.device);
...@@ -227,8 +229,9 @@ class MouseTracker extends ChangeNotifier { ...@@ -227,8 +229,9 @@ class MouseTracker extends ChangeNotifier {
assert((event is PointerAddedEvent) == (lastEvent is PointerRemovedEvent)); assert((event is PointerAddedEvent) == (lastEvent is PointerRemovedEvent));
// Ignore events that are unrelated to mouse tracking. // Ignore events that are unrelated to mouse tracking.
if (event is PointerSignalEvent) if (event is PointerSignalEvent) {
return false; return false;
}
return lastEvent is PointerAddedEvent return lastEvent is PointerAddedEvent
|| event is PointerRemovedEvent || event is PointerRemovedEvent
|| lastEvent.position != event.position; || lastEvent.position != event.position;
...@@ -256,8 +259,9 @@ class MouseTracker extends ChangeNotifier { ...@@ -256,8 +259,9 @@ class MouseTracker extends ChangeNotifier {
assert(hitTest != null); assert(hitTest != null);
final Offset globalPosition = state.latestEvent.position; final Offset globalPosition = state.latestEvent.position;
final int device = state.device; final int device = state.device;
if (!_mouseStates.containsKey(device)) if (!_mouseStates.containsKey(device)) {
return LinkedHashMap<MouseTrackerAnnotation, Matrix4>(); return LinkedHashMap<MouseTrackerAnnotation, Matrix4>();
}
return _hitTestResultToAnnotations(hitTest(globalPosition)); return _hitTestResultToAnnotations(hitTest(globalPosition));
} }
...@@ -303,15 +307,18 @@ class MouseTracker extends ChangeNotifier { ...@@ -303,15 +307,18 @@ class MouseTracker extends ChangeNotifier {
/// position of the event. It should not simply return cached hit test /// position of the event. It should not simply return cached hit test
/// result, because the cache does not change throughout a tap sequence. /// result, because the cache does not change throughout a tap sequence.
void updateWithEvent(PointerEvent event, ValueGetter<HitTestResult> getResult) { void updateWithEvent(PointerEvent event, ValueGetter<HitTestResult> getResult) {
if (event.kind != PointerDeviceKind.mouse) if (event.kind != PointerDeviceKind.mouse) {
return; return;
if (event is PointerSignalEvent) }
if (event is PointerSignalEvent) {
return; return;
}
final HitTestResult result = event is PointerRemovedEvent ? HitTestResult() : getResult(); final HitTestResult result = event is PointerRemovedEvent ? HitTestResult() : getResult();
final int device = event.device; final int device = event.device;
final _MouseState? existingState = _mouseStates[device]; final _MouseState? existingState = _mouseStates[device];
if (!_shouldMarkStateDirty(existingState, event)) if (!_shouldMarkStateDirty(existingState, event)) {
return; return;
}
_monitorMouseConnection(() { _monitorMouseConnection(() {
_deviceUpdatePhase(() { _deviceUpdatePhase(() {
...@@ -319,13 +326,15 @@ class MouseTracker extends ChangeNotifier { ...@@ -319,13 +326,15 @@ class MouseTracker extends ChangeNotifier {
// so that [mouseIsConnected], which is decided by `_mouseStates`, is // so that [mouseIsConnected], which is decided by `_mouseStates`, is
// correct during the callbacks. // correct during the callbacks.
if (existingState == null) { if (existingState == null) {
if (event is PointerRemovedEvent) if (event is PointerRemovedEvent) {
return; return;
}
_mouseStates[device] = _MouseState(initialEvent: event); _mouseStates[device] = _MouseState(initialEvent: event);
} else { } else {
assert(event is! PointerAddedEvent); assert(event is! PointerAddedEvent);
if (event is PointerRemovedEvent) if (event is PointerRemovedEvent) {
_mouseStates.remove(event.device); _mouseStates.remove(event.device);
}
} }
final _MouseState targetState = _mouseStates[device] ?? existingState!; final _MouseState targetState = _mouseStates[device] ?? existingState!;
...@@ -400,8 +409,9 @@ class MouseTracker extends ChangeNotifier { ...@@ -400,8 +409,9 @@ class MouseTracker extends ChangeNotifier {
final PointerExitEvent baseExitEvent = PointerExitEvent.fromMouseEvent(latestEvent); final PointerExitEvent baseExitEvent = PointerExitEvent.fromMouseEvent(latestEvent);
lastAnnotations.forEach((MouseTrackerAnnotation annotation, Matrix4 transform) { lastAnnotations.forEach((MouseTrackerAnnotation annotation, Matrix4 transform) {
if (!nextAnnotations.containsKey(annotation)) if (!nextAnnotations.containsKey(annotation))
if (annotation.validForMouseTracker && annotation.onExit != null) if (annotation.validForMouseTracker && annotation.onExit != null) {
annotation.onExit!(baseExitEvent.transformed(lastAnnotations[annotation])); annotation.onExit!(baseExitEvent.transformed(lastAnnotations[annotation]));
}
}); });
// Send enter events to annotations that are not in last but in next, in // Send enter events to annotations that are not in last but in next, in
...@@ -411,8 +421,9 @@ class MouseTracker extends ChangeNotifier { ...@@ -411,8 +421,9 @@ class MouseTracker extends ChangeNotifier {
).toList(); ).toList();
final PointerEnterEvent baseEnterEvent = PointerEnterEvent.fromMouseEvent(latestEvent); final PointerEnterEvent baseEnterEvent = PointerEnterEvent.fromMouseEvent(latestEvent);
for (final MouseTrackerAnnotation annotation in enteringAnnotations.reversed) { for (final MouseTrackerAnnotation annotation in enteringAnnotations.reversed) {
if (annotation.validForMouseTracker && annotation.onEnter != null) if (annotation.validForMouseTracker && annotation.onEnter != null) {
annotation.onEnter!(baseEnterEvent.transformed(nextAnnotations[annotation])); annotation.onEnter!(baseEnterEvent.transformed(nextAnnotations[annotation]));
}
} }
} }
} }
...@@ -119,8 +119,9 @@ class RenderParagraph extends RenderBox ...@@ -119,8 +119,9 @@ class RenderParagraph extends RenderBox
@override @override
void setupParentData(RenderBox child) { void setupParentData(RenderBox child) {
if (child.parentData is! TextParentData) if (child.parentData is! TextParentData) {
child.parentData = TextParentData(); child.parentData = TextParentData();
}
} }
static final String _placeholderCharacter = String.fromCharCode(PlaceholderSpan.placeholderCodeUnit); static final String _placeholderCharacter = String.fromCharCode(PlaceholderSpan.placeholderCodeUnit);
...@@ -164,8 +165,9 @@ class RenderParagraph extends RenderBox ...@@ -164,8 +165,9 @@ class RenderParagraph extends RenderBox
/// are any. /// are any.
@visibleForTesting @visibleForTesting
List<TextSelection> get selections { List<TextSelection> get selections {
if (_lastSelectableFragments == null) if (_lastSelectableFragments == null) {
return const <TextSelection>[]; return const <TextSelection>[];
}
final List<TextSelection> results = <TextSelection>[]; final List<TextSelection> results = <TextSelection>[];
for (final _SelectableFragment fragment in _lastSelectableFragments!) { for (final _SelectableFragment fragment in _lastSelectableFragments!) {
if (fragment._textSelectionStart != null && if (fragment._textSelectionStart != null &&
...@@ -191,8 +193,9 @@ class RenderParagraph extends RenderBox ...@@ -191,8 +193,9 @@ class RenderParagraph extends RenderBox
SelectionRegistrar? get registrar => _registrar; SelectionRegistrar? get registrar => _registrar;
SelectionRegistrar? _registrar; SelectionRegistrar? _registrar;
set registrar(SelectionRegistrar? value) { set registrar(SelectionRegistrar? value) {
if (value == _registrar) if (value == _registrar) {
return; return;
}
_removeSelectionRegistrarSubscription(); _removeSelectionRegistrarSubscription();
_disposeSelectableFragments(); _disposeSelectableFragments();
_registrar = value; _registrar = value;
...@@ -221,8 +224,9 @@ class RenderParagraph extends RenderBox ...@@ -221,8 +224,9 @@ class RenderParagraph extends RenderBox
while (start < plainText.length) { while (start < plainText.length) {
int end = plainText.indexOf(_placeholderCharacter, start); int end = plainText.indexOf(_placeholderCharacter, start);
if (start != end) { if (start != end) {
if (end == -1) if (end == -1) {
end = plainText.length; end = plainText.length;
}
result.add(_SelectableFragment(paragraph: this, range: TextRange(start: start, end: end))); result.add(_SelectableFragment(paragraph: this, range: TextRange(start: start, end: end)));
start = end; start = end;
} }
...@@ -232,8 +236,9 @@ class RenderParagraph extends RenderBox ...@@ -232,8 +236,9 @@ class RenderParagraph extends RenderBox
} }
void _disposeSelectableFragments() { void _disposeSelectableFragments() {
if (_lastSelectableFragments == null) if (_lastSelectableFragments == null) {
return; return;
}
for (final _SelectableFragment fragment in _lastSelectableFragments!) { for (final _SelectableFragment fragment in _lastSelectableFragments!) {
fragment.dispose(); fragment.dispose();
} }
...@@ -270,8 +275,9 @@ class RenderParagraph extends RenderBox ...@@ -270,8 +275,9 @@ class RenderParagraph extends RenderBox
TextAlign get textAlign => _textPainter.textAlign; TextAlign get textAlign => _textPainter.textAlign;
set textAlign(TextAlign value) { set textAlign(TextAlign value) {
assert(value != null); assert(value != null);
if (_textPainter.textAlign == value) if (_textPainter.textAlign == value) {
return; return;
}
_textPainter.textAlign = value; _textPainter.textAlign = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -292,8 +298,9 @@ class RenderParagraph extends RenderBox ...@@ -292,8 +298,9 @@ class RenderParagraph extends RenderBox
TextDirection get textDirection => _textPainter.textDirection!; TextDirection get textDirection => _textPainter.textDirection!;
set textDirection(TextDirection value) { set textDirection(TextDirection value) {
assert(value != null); assert(value != null);
if (_textPainter.textDirection == value) if (_textPainter.textDirection == value) {
return; return;
}
_textPainter.textDirection = value; _textPainter.textDirection = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -309,8 +316,9 @@ class RenderParagraph extends RenderBox ...@@ -309,8 +316,9 @@ class RenderParagraph extends RenderBox
bool _softWrap; bool _softWrap;
set softWrap(bool value) { set softWrap(bool value) {
assert(value != null); assert(value != null);
if (_softWrap == value) if (_softWrap == value) {
return; return;
}
_softWrap = value; _softWrap = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -320,8 +328,9 @@ class RenderParagraph extends RenderBox ...@@ -320,8 +328,9 @@ class RenderParagraph extends RenderBox
TextOverflow _overflow; TextOverflow _overflow;
set overflow(TextOverflow value) { set overflow(TextOverflow value) {
assert(value != null); assert(value != null);
if (_overflow == value) if (_overflow == value) {
return; return;
}
_overflow = value; _overflow = value;
_textPainter.ellipsis = value == TextOverflow.ellipsis ? _kEllipsis : null; _textPainter.ellipsis = value == TextOverflow.ellipsis ? _kEllipsis : null;
markNeedsLayout(); markNeedsLayout();
...@@ -334,8 +343,9 @@ class RenderParagraph extends RenderBox ...@@ -334,8 +343,9 @@ class RenderParagraph extends RenderBox
double get textScaleFactor => _textPainter.textScaleFactor; double get textScaleFactor => _textPainter.textScaleFactor;
set textScaleFactor(double value) { set textScaleFactor(double value) {
assert(value != null); assert(value != null);
if (_textPainter.textScaleFactor == value) if (_textPainter.textScaleFactor == value) {
return; return;
}
_textPainter.textScaleFactor = value; _textPainter.textScaleFactor = value;
_overflowShader = null; _overflowShader = null;
markNeedsLayout(); markNeedsLayout();
...@@ -349,8 +359,9 @@ class RenderParagraph extends RenderBox ...@@ -349,8 +359,9 @@ class RenderParagraph extends RenderBox
/// zero. /// zero.
set maxLines(int? value) { set maxLines(int? value) {
assert(value == null || value > 0); assert(value == null || value > 0);
if (_textPainter.maxLines == value) if (_textPainter.maxLines == value) {
return; return;
}
_textPainter.maxLines = value; _textPainter.maxLines = value;
_overflowShader = null; _overflowShader = null;
markNeedsLayout(); markNeedsLayout();
...@@ -366,8 +377,9 @@ class RenderParagraph extends RenderBox ...@@ -366,8 +377,9 @@ class RenderParagraph extends RenderBox
Locale? get locale => _textPainter.locale; Locale? get locale => _textPainter.locale;
/// The value may be null. /// The value may be null.
set locale(Locale? value) { set locale(Locale? value) {
if (_textPainter.locale == value) if (_textPainter.locale == value) {
return; return;
}
_textPainter.locale = value; _textPainter.locale = value;
_overflowShader = null; _overflowShader = null;
markNeedsLayout(); markNeedsLayout();
...@@ -377,8 +389,9 @@ class RenderParagraph extends RenderBox ...@@ -377,8 +389,9 @@ class RenderParagraph extends RenderBox
StrutStyle? get strutStyle => _textPainter.strutStyle; StrutStyle? get strutStyle => _textPainter.strutStyle;
/// The value may be null. /// The value may be null.
set strutStyle(StrutStyle? value) { set strutStyle(StrutStyle? value) {
if (_textPainter.strutStyle == value) if (_textPainter.strutStyle == value) {
return; return;
}
_textPainter.strutStyle = value; _textPainter.strutStyle = value;
_overflowShader = null; _overflowShader = null;
markNeedsLayout(); markNeedsLayout();
...@@ -388,8 +401,9 @@ class RenderParagraph extends RenderBox ...@@ -388,8 +401,9 @@ class RenderParagraph extends RenderBox
TextWidthBasis get textWidthBasis => _textPainter.textWidthBasis; TextWidthBasis get textWidthBasis => _textPainter.textWidthBasis;
set textWidthBasis(TextWidthBasis value) { set textWidthBasis(TextWidthBasis value) {
assert(value != null); assert(value != null);
if (_textPainter.textWidthBasis == value) if (_textPainter.textWidthBasis == value) {
return; return;
}
_textPainter.textWidthBasis = value; _textPainter.textWidthBasis = value;
_overflowShader = null; _overflowShader = null;
markNeedsLayout(); markNeedsLayout();
...@@ -398,8 +412,9 @@ class RenderParagraph extends RenderBox ...@@ -398,8 +412,9 @@ class RenderParagraph extends RenderBox
/// {@macro dart.ui.textHeightBehavior} /// {@macro dart.ui.textHeightBehavior}
ui.TextHeightBehavior? get textHeightBehavior => _textPainter.textHeightBehavior; ui.TextHeightBehavior? get textHeightBehavior => _textPainter.textHeightBehavior;
set textHeightBehavior(ui.TextHeightBehavior? value) { set textHeightBehavior(ui.TextHeightBehavior? value) {
if (_textPainter.textHeightBehavior == value) if (_textPainter.textHeightBehavior == value) {
return; return;
}
_textPainter.textHeightBehavior = value; _textPainter.textHeightBehavior = value;
_overflowShader = null; _overflowShader = null;
markNeedsLayout(); markNeedsLayout();
...@@ -409,8 +424,9 @@ class RenderParagraph extends RenderBox ...@@ -409,8 +424,9 @@ class RenderParagraph extends RenderBox
Color? get selectionColor => _selectionColor; Color? get selectionColor => _selectionColor;
Color? _selectionColor; Color? _selectionColor;
set selectionColor(Color? value) { set selectionColor(Color? value) {
if (_selectionColor == value) if (_selectionColor == value) {
return; return;
}
_selectionColor = value; _selectionColor = value;
if (_lastSelectableFragments?.any((_SelectableFragment fragment) => fragment.value.hasSelection) ?? false) { if (_lastSelectableFragments?.any((_SelectableFragment fragment) => fragment.value.hasSelection) ?? false) {
markNeedsPaint(); markNeedsPaint();
...@@ -1247,8 +1263,9 @@ class _SelectableFragment with Selectable, ChangeNotifier { ...@@ -1247,8 +1263,9 @@ class _SelectableFragment with Selectable, ChangeNotifier {
late SelectionGeometry _selectionGeometry; late SelectionGeometry _selectionGeometry;
void _updateSelectionGeometry() { void _updateSelectionGeometry() {
final SelectionGeometry newValue = _getSelectionGeometry(); final SelectionGeometry newValue = _getSelectionGeometry();
if (_selectionGeometry == newValue) if (_selectionGeometry == newValue) {
return; return;
}
_selectionGeometry = newValue; _selectionGeometry = newValue;
notifyListeners(); notifyListeners();
} }
...@@ -1377,10 +1394,11 @@ class _SelectableFragment with Selectable, ChangeNotifier { ...@@ -1377,10 +1394,11 @@ class _SelectableFragment with Selectable, ChangeNotifier {
} }
void _setSelectionPosition(TextPosition? position, {required bool isEnd}) { void _setSelectionPosition(TextPosition? position, {required bool isEnd}) {
if (isEnd) if (isEnd) {
_textSelectionEnd = position; _textSelectionEnd = position;
else } else {
_textSelectionStart = position; _textSelectionStart = position;
}
} }
SelectionResult _handleClearSelection() { SelectionResult _handleClearSelection() {
...@@ -1423,8 +1441,9 @@ class _SelectableFragment with Selectable, ChangeNotifier { ...@@ -1423,8 +1441,9 @@ class _SelectableFragment with Selectable, ChangeNotifier {
/// ///
/// The parameter `start` must be smaller than `end`. /// The parameter `start` must be smaller than `end`.
bool _positionIsWithinCurrentSelection(TextPosition position) { bool _positionIsWithinCurrentSelection(TextPosition position) {
if (_textSelectionStart == null || _textSelectionEnd == null) if (_textSelectionStart == null || _textSelectionEnd == null) {
return false; return false;
}
// Normalize current selection. // Normalize current selection.
late TextPosition currentStart; late TextPosition currentStart;
late TextPosition currentEnd; late TextPosition currentEnd;
...@@ -1509,8 +1528,9 @@ class _SelectableFragment with Selectable, ChangeNotifier { ...@@ -1509,8 +1528,9 @@ class _SelectableFragment with Selectable, ChangeNotifier {
} }
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (_textSelectionStart == null || _textSelectionEnd == null) if (_textSelectionStart == null || _textSelectionEnd == null) {
return; return;
}
if (paragraph.selectionColor != null) { if (paragraph.selectionColor != null) {
final TextSelection selection = TextSelection( final TextSelection selection = TextSelection(
baseOffset: _textSelectionStart!.offset, baseOffset: _textSelectionStart!.offset,
......
...@@ -82,8 +82,9 @@ class RenderPerformanceOverlay extends RenderBox { ...@@ -82,8 +82,9 @@ class RenderPerformanceOverlay extends RenderBox {
int _optionsMask; int _optionsMask;
set optionsMask(int value) { set optionsMask(int value) {
assert(value != null); assert(value != null);
if (value == _optionsMask) if (value == _optionsMask) {
return; return;
}
_optionsMask = value; _optionsMask = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -95,8 +96,9 @@ class RenderPerformanceOverlay extends RenderBox { ...@@ -95,8 +96,9 @@ class RenderPerformanceOverlay extends RenderBox {
int _rasterizerThreshold; int _rasterizerThreshold;
set rasterizerThreshold(int value) { set rasterizerThreshold(int value) {
assert(value != null); assert(value != null);
if (value == _rasterizerThreshold) if (value == _rasterizerThreshold) {
return; return;
}
_rasterizerThreshold = value; _rasterizerThreshold = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -106,8 +108,9 @@ class RenderPerformanceOverlay extends RenderBox { ...@@ -106,8 +108,9 @@ class RenderPerformanceOverlay extends RenderBox {
bool _checkerboardRasterCacheImages; bool _checkerboardRasterCacheImages;
set checkerboardRasterCacheImages(bool value) { set checkerboardRasterCacheImages(bool value) {
assert(value != null); assert(value != null);
if (value == _checkerboardRasterCacheImages) if (value == _checkerboardRasterCacheImages) {
return; return;
}
_checkerboardRasterCacheImages = value; _checkerboardRasterCacheImages = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -117,8 +120,9 @@ class RenderPerformanceOverlay extends RenderBox { ...@@ -117,8 +120,9 @@ class RenderPerformanceOverlay extends RenderBox {
bool _checkerboardOffscreenLayers; bool _checkerboardOffscreenLayers;
set checkerboardOffscreenLayers(bool value) { set checkerboardOffscreenLayers(bool value) {
assert(value != null); assert(value != null);
if (value == _checkerboardOffscreenLayers) if (value == _checkerboardOffscreenLayers) {
return; return;
}
_checkerboardOffscreenLayers = value; _checkerboardOffscreenLayers = value;
markNeedsPaint(); markNeedsPaint();
} }
...@@ -143,11 +147,13 @@ class RenderPerformanceOverlay extends RenderBox { ...@@ -143,11 +147,13 @@ class RenderPerformanceOverlay extends RenderBox {
const double kDefaultGraphHeight = 80.0; const double kDefaultGraphHeight = 80.0;
double result = 0.0; double result = 0.0;
if ((optionsMask | (1 << PerformanceOverlayOption.displayRasterizerStatistics.index) > 0) || if ((optionsMask | (1 << PerformanceOverlayOption.displayRasterizerStatistics.index) > 0) ||
(optionsMask | (1 << PerformanceOverlayOption.visualizeRasterizerStatistics.index) > 0)) (optionsMask | (1 << PerformanceOverlayOption.visualizeRasterizerStatistics.index) > 0)) {
result += kDefaultGraphHeight; result += kDefaultGraphHeight;
}
if ((optionsMask | (1 << PerformanceOverlayOption.displayEngineStatistics.index) > 0) || if ((optionsMask | (1 << PerformanceOverlayOption.displayEngineStatistics.index) > 0) ||
(optionsMask | (1 << PerformanceOverlayOption.visualizeEngineStatistics.index) > 0)) (optionsMask | (1 << PerformanceOverlayOption.visualizeEngineStatistics.index) > 0)) {
result += kDefaultGraphHeight; result += kDefaultGraphHeight;
}
return result; return result;
} }
......
...@@ -111,8 +111,9 @@ class RenderAndroidView extends PlatformViewRenderBox { ...@@ -111,8 +111,9 @@ class RenderAndroidView extends PlatformViewRenderBox {
set controller(AndroidViewController controller) { set controller(AndroidViewController controller) {
assert(_viewController != null); assert(_viewController != null);
assert(controller != null); assert(controller != null);
if (_viewController == controller) if (_viewController == controller) {
return; return;
}
_viewController.removeOnPlatformViewCreatedListener(_onPlatformViewCreated); _viewController.removeOnPlatformViewCreatedListener(_onPlatformViewCreated);
super.controller = controller; super.controller = controller;
_viewController = controller; _viewController = controller;
...@@ -166,8 +167,9 @@ class RenderAndroidView extends PlatformViewRenderBox { ...@@ -166,8 +167,9 @@ class RenderAndroidView extends PlatformViewRenderBox {
// Android virtual displays cannot have a zero size. // Android virtual displays cannot have a zero size.
// Trying to size it to 0 crashes the app, which was happening when starting the app // Trying to size it to 0 crashes the app, which was happening when starting the app
// with a locked screen (see: https://github.com/flutter/flutter/issues/20456). // with a locked screen (see: https://github.com/flutter/flutter/issues/20456).
if (_state == _PlatformViewState.resizing || size.isEmpty) if (_state == _PlatformViewState.resizing || size.isEmpty) {
return; return;
}
_state = _PlatformViewState.resizing; _state = _PlatformViewState.resizing;
markNeedsPaint(); markNeedsPaint();
...@@ -200,8 +202,9 @@ class RenderAndroidView extends PlatformViewRenderBox { ...@@ -200,8 +202,9 @@ class RenderAndroidView extends PlatformViewRenderBox {
void _setOffset() { void _setOffset() {
SchedulerBinding.instance.addPostFrameCallback((_) async { SchedulerBinding.instance.addPostFrameCallback((_) async {
if (!_isDisposed) { if (!_isDisposed) {
if (attached) if (attached) {
await _viewController.setOffset(localToGlobal(Offset.zero)); await _viewController.setOffset(localToGlobal(Offset.zero));
}
// Schedule a new post frame callback. // Schedule a new post frame callback.
_setOffset(); _setOffset();
} }
...@@ -210,8 +213,9 @@ class RenderAndroidView extends PlatformViewRenderBox { ...@@ -210,8 +213,9 @@ class RenderAndroidView extends PlatformViewRenderBox {
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (_viewController.textureId == null || _currentTextureSize == null) if (_viewController.textureId == null || _currentTextureSize == null) {
return; return;
}
// As resizing the Android view happens asynchronously we don't know exactly when is a // As resizing the Android view happens asynchronously we don't know exactly when is a
// texture frame with the new size is ready for consumption. // texture frame with the new size is ready for consumption.
...@@ -248,8 +252,9 @@ class RenderAndroidView extends PlatformViewRenderBox { ...@@ -248,8 +252,9 @@ class RenderAndroidView extends PlatformViewRenderBox {
} }
void _paintTexture(PaintingContext context, Offset offset) { void _paintTexture(PaintingContext context, Offset offset) {
if (_currentTextureSize == null) if (_currentTextureSize == null) {
return; return;
}
context.addLayer(TextureLayer( context.addLayer(TextureLayer(
rect: offset & _currentTextureSize!, rect: offset & _currentTextureSize!,
...@@ -372,8 +377,9 @@ class RenderUiKitView extends RenderBox { ...@@ -372,8 +377,9 @@ class RenderUiKitView extends RenderBox {
@override @override
bool hitTest(BoxHitTestResult result, { Offset? position }) { bool hitTest(BoxHitTestResult result, { Offset? position }) {
if (hitTestBehavior == PlatformViewHitTestBehavior.transparent || !size.contains(position!)) if (hitTestBehavior == PlatformViewHitTestBehavior.transparent || !size.contains(position!)) {
return false; return false;
}
result.add(BoxHitTestEntry(this, position)); result.add(BoxHitTestEntry(this, position));
return hitTestBehavior == PlatformViewHitTestBehavior.opaque; return hitTestBehavior == PlatformViewHitTestBehavior.opaque;
} }
...@@ -716,8 +722,9 @@ mixin _PlatformViewGestureMixin on RenderBox implements MouseTrackerAnnotation { ...@@ -716,8 +722,9 @@ mixin _PlatformViewGestureMixin on RenderBox implements MouseTrackerAnnotation {
set hitTestBehavior(PlatformViewHitTestBehavior value) { set hitTestBehavior(PlatformViewHitTestBehavior value) {
if (value != _hitTestBehavior) { if (value != _hitTestBehavior) {
_hitTestBehavior = value; _hitTestBehavior = value;
if (owner != null) if (owner != null) {
markNeedsPaint(); markNeedsPaint();
}
} }
} }
PlatformViewHitTestBehavior? _hitTestBehavior; PlatformViewHitTestBehavior? _hitTestBehavior;
......
...@@ -42,8 +42,9 @@ abstract class RenderProxySliver extends RenderSliver with RenderObjectWithChild ...@@ -42,8 +42,9 @@ abstract class RenderProxySliver extends RenderSliver with RenderObjectWithChild
@override @override
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
if (child.parentData is! SliverPhysicalParentData) if (child.parentData is! SliverPhysicalParentData) {
child.parentData = SliverPhysicalParentData(); child.parentData = SliverPhysicalParentData();
}
} }
@override @override
...@@ -55,8 +56,9 @@ abstract class RenderProxySliver extends RenderSliver with RenderObjectWithChild ...@@ -55,8 +56,9 @@ abstract class RenderProxySliver extends RenderSliver with RenderObjectWithChild
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (child != null) if (child != null) {
context.paintChild(child!, offset); context.paintChild(child!, offset);
}
} }
@override @override
...@@ -131,17 +133,20 @@ class RenderSliverOpacity extends RenderProxySliver { ...@@ -131,17 +133,20 @@ class RenderSliverOpacity extends RenderProxySliver {
set opacity(double value) { set opacity(double value) {
assert(value != null); assert(value != null);
assert(value >= 0.0 && value <= 1.0); assert(value >= 0.0 && value <= 1.0);
if (_opacity == value) if (_opacity == value) {
return; return;
}
final bool didNeedCompositing = alwaysNeedsCompositing; final bool didNeedCompositing = alwaysNeedsCompositing;
final bool wasVisible = _alpha != 0; final bool wasVisible = _alpha != 0;
_opacity = value; _opacity = value;
_alpha = ui.Color.getAlphaFromOpacity(_opacity); _alpha = ui.Color.getAlphaFromOpacity(_opacity);
if (didNeedCompositing != alwaysNeedsCompositing) if (didNeedCompositing != alwaysNeedsCompositing) {
markNeedsCompositingBitsUpdate(); markNeedsCompositingBitsUpdate();
}
markNeedsPaint(); markNeedsPaint();
if (wasVisible != (_alpha != 0) && !alwaysIncludeSemantics) if (wasVisible != (_alpha != 0) && !alwaysIncludeSemantics) {
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
}
} }
/// Whether child semantics are included regardless of the opacity. /// Whether child semantics are included regardless of the opacity.
...@@ -152,8 +157,9 @@ class RenderSliverOpacity extends RenderProxySliver { ...@@ -152,8 +157,9 @@ class RenderSliverOpacity extends RenderProxySliver {
bool get alwaysIncludeSemantics => _alwaysIncludeSemantics; bool get alwaysIncludeSemantics => _alwaysIncludeSemantics;
bool _alwaysIncludeSemantics; bool _alwaysIncludeSemantics;
set alwaysIncludeSemantics(bool value) { set alwaysIncludeSemantics(bool value) {
if (value == _alwaysIncludeSemantics) if (value == _alwaysIncludeSemantics) {
return; return;
}
_alwaysIncludeSemantics = value; _alwaysIncludeSemantics = value;
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
} }
...@@ -182,8 +188,9 @@ class RenderSliverOpacity extends RenderProxySliver { ...@@ -182,8 +188,9 @@ class RenderSliverOpacity extends RenderProxySliver {
@override @override
void visitChildrenForSemantics(RenderObjectVisitor visitor) { void visitChildrenForSemantics(RenderObjectVisitor visitor) {
if (child != null && (_alpha != 0 || alwaysIncludeSemantics)) if (child != null && (_alpha != 0 || alwaysIncludeSemantics)) {
visitor(child!); visitor(child!);
}
} }
@override @override
...@@ -227,11 +234,13 @@ class RenderSliverIgnorePointer extends RenderProxySliver { ...@@ -227,11 +234,13 @@ class RenderSliverIgnorePointer extends RenderProxySliver {
bool _ignoring; bool _ignoring;
set ignoring(bool value) { set ignoring(bool value) {
assert(value != null); assert(value != null);
if (value == _ignoring) if (value == _ignoring) {
return; return;
}
_ignoring = value; _ignoring = value;
if (_ignoringSemantics == null || !_ignoringSemantics!) if (_ignoringSemantics == null || !_ignoringSemantics!) {
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
}
} }
/// Whether the semantics of this render object is ignored when compiling the /// Whether the semantics of this render object is ignored when compiling the
...@@ -243,12 +252,14 @@ class RenderSliverIgnorePointer extends RenderProxySliver { ...@@ -243,12 +252,14 @@ class RenderSliverIgnorePointer extends RenderProxySliver {
bool? get ignoringSemantics => _ignoringSemantics; bool? get ignoringSemantics => _ignoringSemantics;
bool? _ignoringSemantics; bool? _ignoringSemantics;
set ignoringSemantics(bool? value) { set ignoringSemantics(bool? value) {
if (value == _ignoringSemantics) if (value == _ignoringSemantics) {
return; return;
}
final bool oldEffectiveValue = _effectiveIgnoringSemantics; final bool oldEffectiveValue = _effectiveIgnoringSemantics;
_ignoringSemantics = value; _ignoringSemantics = value;
if (oldEffectiveValue != _effectiveIgnoringSemantics) if (oldEffectiveValue != _effectiveIgnoringSemantics) {
markNeedsSemanticsUpdate(); markNeedsSemanticsUpdate();
}
} }
bool get _effectiveIgnoringSemantics => ignoringSemantics ?? ignoring; bool get _effectiveIgnoringSemantics => ignoringSemantics ?? ignoring;
...@@ -265,8 +276,9 @@ class RenderSliverIgnorePointer extends RenderProxySliver { ...@@ -265,8 +276,9 @@ class RenderSliverIgnorePointer extends RenderProxySliver {
@override @override
void visitChildrenForSemantics(RenderObjectVisitor visitor) { void visitChildrenForSemantics(RenderObjectVisitor visitor) {
if (child != null && !_effectiveIgnoringSemantics) if (child != null && !_effectiveIgnoringSemantics) {
visitor(child!); visitor(child!);
}
} }
@override @override
...@@ -302,8 +314,9 @@ class RenderSliverOffstage extends RenderProxySliver { ...@@ -302,8 +314,9 @@ class RenderSliverOffstage extends RenderProxySliver {
set offstage(bool value) { set offstage(bool value) {
assert(value != null); assert(value != null);
if (value == _offstage) if (value == _offstage) {
return; return;
}
_offstage = value; _offstage = value;
markNeedsLayoutForSizedByParentChange(); markNeedsLayoutForSizedByParentChange();
} }
...@@ -312,10 +325,11 @@ class RenderSliverOffstage extends RenderProxySliver { ...@@ -312,10 +325,11 @@ class RenderSliverOffstage extends RenderProxySliver {
void performLayout() { void performLayout() {
assert(child != null); assert(child != null);
child!.layout(constraints, parentUsesSize: true); child!.layout(constraints, parentUsesSize: true);
if (!offstage) if (!offstage) {
geometry = child!.geometry; geometry = child!.geometry;
else } else {
geometry = SliverGeometry.zero; geometry = SliverGeometry.zero;
}
} }
@override @override
...@@ -341,15 +355,17 @@ class RenderSliverOffstage extends RenderProxySliver { ...@@ -341,15 +355,17 @@ class RenderSliverOffstage extends RenderProxySliver {
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (offstage) if (offstage) {
return; return;
}
context.paintChild(child!, offset); context.paintChild(child!, offset);
} }
@override @override
void visitChildrenForSemantics(RenderObjectVisitor visitor) { void visitChildrenForSemantics(RenderObjectVisitor visitor) {
if (offstage) if (offstage) {
return; return;
}
super.visitChildrenForSemantics(visitor); super.visitChildrenForSemantics(visitor);
} }
...@@ -361,8 +377,9 @@ class RenderSliverOffstage extends RenderProxySliver { ...@@ -361,8 +377,9 @@ class RenderSliverOffstage extends RenderProxySliver {
@override @override
List<DiagnosticsNode> debugDescribeChildren() { List<DiagnosticsNode> debugDescribeChildren() {
if (child == null) if (child == null) {
return <DiagnosticsNode>[]; return <DiagnosticsNode>[];
}
return <DiagnosticsNode>[ return <DiagnosticsNode>[
child!.toDiagnosticsNode( child!.toDiagnosticsNode(
name: 'child', name: 'child',
......
...@@ -34,8 +34,9 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB ...@@ -34,8 +34,9 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB
int _quarterTurns; int _quarterTurns;
set quarterTurns(int value) { set quarterTurns(int value) {
assert(value != null); assert(value != null);
if (_quarterTurns == value) if (_quarterTurns == value) {
return; return;
}
_quarterTurns = value; _quarterTurns = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -44,29 +45,33 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB ...@@ -44,29 +45,33 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB
@override @override
double computeMinIntrinsicWidth(double height) { double computeMinIntrinsicWidth(double height) {
if (child == null) if (child == null) {
return 0.0; return 0.0;
}
return _isVertical ? child!.getMinIntrinsicHeight(height) : child!.getMinIntrinsicWidth(height); return _isVertical ? child!.getMinIntrinsicHeight(height) : child!.getMinIntrinsicWidth(height);
} }
@override @override
double computeMaxIntrinsicWidth(double height) { double computeMaxIntrinsicWidth(double height) {
if (child == null) if (child == null) {
return 0.0; return 0.0;
}
return _isVertical ? child!.getMaxIntrinsicHeight(height) : child!.getMaxIntrinsicWidth(height); return _isVertical ? child!.getMaxIntrinsicHeight(height) : child!.getMaxIntrinsicWidth(height);
} }
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
if (child == null) if (child == null) {
return 0.0; return 0.0;
}
return _isVertical ? child!.getMinIntrinsicWidth(width) : child!.getMinIntrinsicHeight(width); return _isVertical ? child!.getMinIntrinsicWidth(width) : child!.getMinIntrinsicHeight(width);
} }
@override @override
double computeMaxIntrinsicHeight(double width) { double computeMaxIntrinsicHeight(double width) {
if (child == null) if (child == null) {
return 0.0; return 0.0;
}
return _isVertical ? child!.getMaxIntrinsicWidth(width) : child!.getMaxIntrinsicHeight(width); return _isVertical ? child!.getMaxIntrinsicWidth(width) : child!.getMaxIntrinsicHeight(width);
} }
...@@ -99,8 +104,9 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB ...@@ -99,8 +104,9 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB
@override @override
bool hitTestChildren(BoxHitTestResult result, { required Offset position }) { bool hitTestChildren(BoxHitTestResult result, { required Offset position }) {
assert(_paintTransform != null || debugNeedsLayout || child == null); assert(_paintTransform != null || debugNeedsLayout || child == null);
if (child == null || _paintTransform == null) if (child == null || _paintTransform == null) {
return false; return false;
}
return result.addWithPaintTransform( return result.addWithPaintTransform(
transform: _paintTransform, transform: _paintTransform,
position: position, position: position,
...@@ -139,8 +145,9 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB ...@@ -139,8 +145,9 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin<RenderB
@override @override
void applyPaintTransform(RenderBox child, Matrix4 transform) { void applyPaintTransform(RenderBox child, Matrix4 transform) {
if (_paintTransform != null) if (_paintTransform != null) {
transform.multiply(_paintTransform!); transform.multiply(_paintTransform!);
}
super.applyPaintTransform(child, transform); super.applyPaintTransform(child, transform);
} }
} }
...@@ -161,8 +161,9 @@ mixin SelectionRegistrant on Selectable { ...@@ -161,8 +161,9 @@ mixin SelectionRegistrant on Selectable {
SelectionRegistrar? get registrar => _registrar; SelectionRegistrar? get registrar => _registrar;
SelectionRegistrar? _registrar; SelectionRegistrar? _registrar;
set registrar(SelectionRegistrar? value) { set registrar(SelectionRegistrar? value) {
if (value == _registrar) if (value == _registrar) {
return; return;
}
if (value == null) { if (value == null) {
// When registrar goes from non-null to null; // When registrar goes from non-null to null;
removeListener(_updateSelectionRegistrarSubscription); removeListener(_updateSelectionRegistrarSubscription);
...@@ -219,10 +220,12 @@ class SelectionUtils { ...@@ -219,10 +220,12 @@ class SelectionUtils {
if (targetRect.contains(point)) { if (targetRect.contains(point)) {
return SelectionResult.end; return SelectionResult.end;
} }
if (point.dy < targetRect.top) if (point.dy < targetRect.top) {
return SelectionResult.previous; return SelectionResult.previous;
if (point.dy > targetRect.bottom) }
if (point.dy > targetRect.bottom) {
return SelectionResult.next; return SelectionResult.next;
}
return point.dx >= targetRect.right return point.dx >= targetRect.right
? SelectionResult.next ? SelectionResult.next
: SelectionResult.previous; : SelectionResult.previous;
...@@ -505,10 +508,12 @@ class SelectionGeometry { ...@@ -505,10 +508,12 @@ class SelectionGeometry {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(this, other)) if (identical(this, other)) {
return true; return true;
if (other.runtimeType != runtimeType) }
if (other.runtimeType != runtimeType) {
return false; return false;
}
return other is SelectionGeometry return other is SelectionGeometry
&& other.startSelectionPoint == startSelectionPoint && other.startSelectionPoint == startSelectionPoint
&& other.endSelectionPoint == endSelectionPoint && other.endSelectionPoint == endSelectionPoint
...@@ -555,10 +560,12 @@ class SelectionPoint { ...@@ -555,10 +560,12 @@ class SelectionPoint {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(this, other)) if (identical(this, other)) {
return true; return true;
if (other.runtimeType != runtimeType) }
if (other.runtimeType != runtimeType) {
return false; return false;
}
return other is SelectionPoint return other is SelectionPoint
&& other.localPosition == localPosition && other.localPosition == localPosition
&& other.lineHeight == lineHeight && other.lineHeight == lineHeight
......
...@@ -411,8 +411,9 @@ class SliverConstraints extends Constraints { ...@@ -411,8 +411,9 @@ class SliverConstraints extends Constraints {
bool hasErrors = false; bool hasErrors = false;
final StringBuffer errorMessage = StringBuffer('\n'); final StringBuffer errorMessage = StringBuffer('\n');
void verify(bool check, String message) { void verify(bool check, String message) {
if (check) if (check) {
return; return;
}
hasErrors = true; hasErrors = true;
errorMessage.writeln(' $message'); errorMessage.writeln(' $message');
} }
...@@ -461,10 +462,12 @@ class SliverConstraints extends Constraints { ...@@ -461,10 +462,12 @@ class SliverConstraints extends Constraints {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(this, other)) if (identical(this, other)) {
return true; return true;
if (other is! SliverConstraints) }
if (other is! SliverConstraints) {
return false; return false;
}
assert(other.debugAssertIsValid()); assert(other.debugAssertIsValid());
return other.axisDirection == axisDirection return other.axisDirection == axisDirection
&& other.growthDirection == growthDirection && other.growthDirection == growthDirection
...@@ -704,8 +707,9 @@ class SliverGeometry with Diagnosticable { ...@@ -704,8 +707,9 @@ class SliverGeometry with Diagnosticable {
}) { }) {
assert(() { assert(() {
void verify(bool check, String summary, {List<DiagnosticsNode>? details}) { void verify(bool check, String summary, {List<DiagnosticsNode>? details}) {
if (check) if (check) {
return; return;
}
throw FlutterError.fromParts(<DiagnosticsNode>[ throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary('${objectRuntimeType(this, 'SliverGeometry')} is not valid: $summary'), ErrorSummary('${objectRuntimeType(this, 'SliverGeometry')} is not valid: $summary'),
...?details, ...?details,
...@@ -1140,8 +1144,9 @@ abstract class RenderSliver extends RenderObject { ...@@ -1140,8 +1144,9 @@ abstract class RenderSliver extends RenderObject {
assert(sizedByParent || !debugDoingThisResize); assert(sizedByParent || !debugDoingThisResize);
assert(() { assert(() {
if ((sizedByParent && debugDoingThisResize) || if ((sizedByParent && debugDoingThisResize) ||
(!sizedByParent && debugDoingThisLayout)) (!sizedByParent && debugDoingThisLayout)) {
return true; return true;
}
assert(!debugDoingThisResize); assert(!debugDoingThisResize);
DiagnosticsNode? contract, violation, hint; DiagnosticsNode? contract, violation, hint;
if (debugDoingThisLayout) { if (debugDoingThisLayout) {
...@@ -1149,13 +1154,15 @@ abstract class RenderSliver extends RenderObject { ...@@ -1149,13 +1154,15 @@ abstract class RenderSliver extends RenderObject {
violation = ErrorDescription('It appears that the geometry setter was called from performLayout().'); violation = ErrorDescription('It appears that the geometry setter was called from performLayout().');
} else { } else {
violation = ErrorDescription('The geometry setter was called from outside layout (neither performResize() nor performLayout() were being run for this object).'); violation = ErrorDescription('The geometry setter was called from outside layout (neither performResize() nor performLayout() were being run for this object).');
if (owner != null && owner!.debugDoingLayout) if (owner != null && owner!.debugDoingLayout) {
hint = ErrorDescription('Only the object itself can set its geometry. It is a contract violation for other objects to set it.'); hint = ErrorDescription('Only the object itself can set its geometry. It is a contract violation for other objects to set it.');
}
} }
if (sizedByParent) if (sizedByParent) {
contract = ErrorDescription('Because this RenderSliver has sizedByParent set to true, it must set its geometry in performResize().'); contract = ErrorDescription('Because this RenderSliver has sizedByParent set to true, it must set its geometry in performResize().');
else } else {
contract = ErrorDescription('Because this RenderSliver has sizedByParent set to false, it must set its geometry in performLayout().'); contract = ErrorDescription('Because this RenderSliver has sizedByParent set to false, it must set its geometry in performLayout().');
}
final List<DiagnosticsNode> information = <DiagnosticsNode>[ final List<DiagnosticsNode> information = <DiagnosticsNode>[
ErrorSummary('RenderSliver geometry setter called incorrectly.'), ErrorSummary('RenderSliver geometry setter called incorrectly.'),
...@@ -1476,8 +1483,9 @@ abstract class RenderSliver extends RenderObject { ...@@ -1476,8 +1483,9 @@ abstract class RenderSliver extends RenderObject {
void _debugDrawArrow(Canvas canvas, Paint paint, Offset p0, Offset p1, GrowthDirection direction) { void _debugDrawArrow(Canvas canvas, Paint paint, Offset p0, Offset p1, GrowthDirection direction) {
assert(() { assert(() {
if (p0 == p1) if (p0 == p1) {
return true; return true;
}
assert(p0.dx == p1.dx || p0.dy == p1.dy); // must be axis-aligned assert(p0.dx == p1.dx || p0.dy == p1.dy); // must be axis-aligned
final double d = (p1 - p0).distance * 0.2; final double d = (p1 - p0).distance * 0.2;
final Offset temp; final Offset temp;
...@@ -1680,13 +1688,15 @@ mixin RenderSliverHelpers implements RenderSliver { ...@@ -1680,13 +1688,15 @@ mixin RenderSliverHelpers implements RenderSliver {
assert(constraints.axis != null); assert(constraints.axis != null);
switch (constraints.axis) { switch (constraints.axis) {
case Axis.horizontal: case Axis.horizontal:
if (!rightWayUp) if (!rightWayUp) {
delta = geometry!.paintExtent - child.size.width - delta; delta = geometry!.paintExtent - child.size.width - delta;
}
transform.translate(delta, crossAxisDelta); transform.translate(delta, crossAxisDelta);
break; break;
case Axis.vertical: case Axis.vertical:
if (!rightWayUp) if (!rightWayUp) {
delta = geometry!.paintExtent - child.size.height - delta; delta = geometry!.paintExtent - child.size.height - delta;
}
transform.translate(crossAxisDelta, delta); transform.translate(crossAxisDelta, delta);
break; break;
} }
...@@ -1716,8 +1726,9 @@ abstract class RenderSliverSingleBoxAdapter extends RenderSliver with RenderObje ...@@ -1716,8 +1726,9 @@ abstract class RenderSliverSingleBoxAdapter extends RenderSliver with RenderObje
@override @override
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
if (child.parentData is! SliverPhysicalParentData) if (child.parentData is! SliverPhysicalParentData) {
child.parentData = SliverPhysicalParentData(); child.parentData = SliverPhysicalParentData();
}
} }
/// Sets the [SliverPhysicalParentData.paintOffset] for the given child /// Sets the [SliverPhysicalParentData.paintOffset] for the given child
...@@ -1748,8 +1759,9 @@ abstract class RenderSliverSingleBoxAdapter extends RenderSliver with RenderObje ...@@ -1748,8 +1759,9 @@ abstract class RenderSliverSingleBoxAdapter extends RenderSliver with RenderObje
@override @override
bool hitTestChildren(SliverHitTestResult result, { required double mainAxisPosition, required double crossAxisPosition }) { bool hitTestChildren(SliverHitTestResult result, { required double mainAxisPosition, required double crossAxisPosition }) {
assert(geometry!.hitTestExtent > 0.0); assert(geometry!.hitTestExtent > 0.0);
if (child != null) if (child != null) {
return hitTestBoxChild(BoxHitTestResult.wrap(result), child!, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition); return hitTestBoxChild(BoxHitTestResult.wrap(result), child!, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition);
}
return false; return false;
} }
......
...@@ -48,8 +48,9 @@ class RenderSliverFillViewport extends RenderSliverFixedExtentBoxAdaptor { ...@@ -48,8 +48,9 @@ class RenderSliverFillViewport extends RenderSliverFixedExtentBoxAdaptor {
double _viewportFraction; double _viewportFraction;
set viewportFraction(double value) { set viewportFraction(double value) {
assert(value != null); assert(value != null);
if (_viewportFraction == value) if (_viewportFraction == value) {
return; return;
}
_viewportFraction = value; _viewportFraction = value;
markNeedsLayout(); markNeedsLayout();
} }
...@@ -86,11 +87,12 @@ class RenderSliverFillRemainingWithScrollable extends RenderSliverSingleBoxAdapt ...@@ -86,11 +87,12 @@ class RenderSliverFillRemainingWithScrollable extends RenderSliverSingleBoxAdapt
final SliverConstraints constraints = this.constraints; final SliverConstraints constraints = this.constraints;
final double extent = constraints.remainingPaintExtent - math.min(constraints.overlap, 0.0); final double extent = constraints.remainingPaintExtent - math.min(constraints.overlap, 0.0);
if (child != null) if (child != null) {
child!.layout(constraints.asBoxConstraints( child!.layout(constraints.asBoxConstraints(
minExtent: extent, minExtent: extent,
maxExtent: extent, maxExtent: extent,
)); ));
}
final double paintedChildSize = calculatePaintOffset(constraints, from: 0.0, to: extent); final double paintedChildSize = calculatePaintOffset(constraints, from: 0.0, to: extent);
assert(paintedChildSize.isFinite); assert(paintedChildSize.isFinite);
...@@ -101,8 +103,9 @@ class RenderSliverFillRemainingWithScrollable extends RenderSliverSingleBoxAdapt ...@@ -101,8 +103,9 @@ class RenderSliverFillRemainingWithScrollable extends RenderSliverSingleBoxAdapt
maxPaintExtent: paintedChildSize, maxPaintExtent: paintedChildSize,
hasVisualOverflow: extent > constraints.remainingPaintExtent || constraints.scrollOffset > 0.0, hasVisualOverflow: extent > constraints.remainingPaintExtent || constraints.scrollOffset > 0.0,
); );
if (child != null) if (child != null) {
setChildParentData(child!, constraints, geometry!); setChildParentData(child!, constraints, geometry!);
}
} }
} }
...@@ -174,8 +177,9 @@ class RenderSliverFillRemaining extends RenderSliverSingleBoxAdapter { ...@@ -174,8 +177,9 @@ class RenderSliverFillRemaining extends RenderSliverSingleBoxAdapter {
maxPaintExtent: paintedChildSize, maxPaintExtent: paintedChildSize,
hasVisualOverflow: extent > constraints.remainingPaintExtent || constraints.scrollOffset > 0.0, hasVisualOverflow: extent > constraints.remainingPaintExtent || constraints.scrollOffset > 0.0,
); );
if (child != null) if (child != null) {
setChildParentData(child!, constraints, geometry!); setChildParentData(child!, constraints, geometry!);
}
} }
} }
...@@ -251,7 +255,8 @@ class RenderSliverFillRemainingAndOverscroll extends RenderSliverSingleBoxAdapte ...@@ -251,7 +255,8 @@ class RenderSliverFillRemainingAndOverscroll extends RenderSliverSingleBoxAdapte
maxPaintExtent: maxExtent, maxPaintExtent: maxExtent,
hasVisualOverflow: extent > constraints.remainingPaintExtent || constraints.scrollOffset > 0.0, hasVisualOverflow: extent > constraints.remainingPaintExtent || constraints.scrollOffset > 0.0,
); );
if (child != null) if (child != null) {
setChildParentData(child!, constraints, geometry!); setChildParentData(child!, constraints, geometry!);
}
} }
} }
...@@ -310,8 +310,9 @@ abstract class RenderSliverFixedExtentBoxAdaptor extends RenderSliverMultiBoxAda ...@@ -310,8 +310,9 @@ abstract class RenderSliverFixedExtentBoxAdaptor extends RenderSliverMultiBoxAda
// We may have started the layout while scrolled to the end, which would not // We may have started the layout while scrolled to the end, which would not
// expose a new child. // expose a new child.
if (estimatedMaxScrollOffset == trailingScrollOffset) if (estimatedMaxScrollOffset == trailingScrollOffset) {
childManager.setDidUnderflow(true); childManager.setDidUnderflow(true);
}
childManager.didFinishLayout(); childManager.didFinishLayout();
} }
} }
...@@ -351,8 +352,9 @@ class RenderSliverFixedExtentList extends RenderSliverFixedExtentBoxAdaptor { ...@@ -351,8 +352,9 @@ class RenderSliverFixedExtentList extends RenderSliverFixedExtentBoxAdaptor {
double _itemExtent; double _itemExtent;
set itemExtent(double value) { set itemExtent(double value) {
assert(value != null); assert(value != null);
if (_itemExtent == value) if (_itemExtent == value) {
return; return;
}
_itemExtent = value; _itemExtent = value;
markNeedsLayout(); markNeedsLayout();
} }
......
...@@ -207,8 +207,9 @@ class SliverGridRegularTileLayout extends SliverGridLayout { ...@@ -207,8 +207,9 @@ class SliverGridRegularTileLayout extends SliverGridLayout {
} }
double _getOffsetFromStartInCrossAxis(double crossAxisStart) { double _getOffsetFromStartInCrossAxis(double crossAxisStart) {
if (reverseCrossAxis) if (reverseCrossAxis) {
return crossAxisCount * crossAxisStride - crossAxisStart - childCrossAxisExtent - (crossAxisStride - childCrossAxisExtent); return crossAxisCount * crossAxisStride - crossAxisStart - childCrossAxisExtent - (crossAxisStride - childCrossAxisExtent);
}
return crossAxisStart; return crossAxisStart;
} }
...@@ -526,8 +527,9 @@ class RenderSliverGrid extends RenderSliverMultiBoxAdaptor { ...@@ -526,8 +527,9 @@ class RenderSliverGrid extends RenderSliverMultiBoxAdaptor {
@override @override
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
if (child.parentData is! SliverGridParentData) if (child.parentData is! SliverGridParentData) {
child.parentData = SliverGridParentData(); child.parentData = SliverGridParentData();
}
} }
/// The delegate that controls the size and position of the children. /// The delegate that controls the size and position of the children.
...@@ -535,11 +537,13 @@ class RenderSliverGrid extends RenderSliverMultiBoxAdaptor { ...@@ -535,11 +537,13 @@ class RenderSliverGrid extends RenderSliverMultiBoxAdaptor {
SliverGridDelegate _gridDelegate; SliverGridDelegate _gridDelegate;
set gridDelegate(SliverGridDelegate value) { set gridDelegate(SliverGridDelegate value) {
assert(value != null); assert(value != null);
if (_gridDelegate == value) if (_gridDelegate == value) {
return; return;
}
if (value.runtimeType != _gridDelegate.runtimeType || if (value.runtimeType != _gridDelegate.runtimeType ||
value.shouldRelayout(_gridDelegate)) value.shouldRelayout(_gridDelegate)) {
markNeedsLayout(); markNeedsLayout();
}
_gridDelegate = value; _gridDelegate = value;
} }
...@@ -677,8 +681,9 @@ class RenderSliverGrid extends RenderSliverMultiBoxAdaptor { ...@@ -677,8 +681,9 @@ class RenderSliverGrid extends RenderSliverMultiBoxAdaptor {
// We may have started the layout while scrolled to the end, which // We may have started the layout while scrolled to the end, which
// would not expose a new child. // would not expose a new child.
if (estimatedTotalExtent == trailingScrollOffset) if (estimatedTotalExtent == trailingScrollOffset) {
childManager.setDidUnderflow(true); childManager.setDidUnderflow(true);
}
childManager.didFinishLayout(); childManager.didFinishLayout();
} }
} }
...@@ -227,11 +227,13 @@ class RenderSliverList extends RenderSliverMultiBoxAdaptor { ...@@ -227,11 +227,13 @@ class RenderSliverList extends RenderSliverMultiBoxAdaptor {
bool advance() { // returns true if we advanced, false if we have no more children bool advance() { // returns true if we advanced, false if we have no more children
// This function is used in two different places below, to avoid code duplication. // This function is used in two different places below, to avoid code duplication.
assert(child != null); assert(child != null);
if (child == trailingChildWithLayout) if (child == trailingChildWithLayout) {
inLayoutRange = false; inLayoutRange = false;
}
child = childAfter(child!); child = childAfter(child!);
if (child == null) if (child == null) {
inLayoutRange = false; inLayoutRange = false;
}
index += 1; index += 1;
if (!inLayoutRange) { if (!inLayoutRange) {
if (child == null || indexOf(child!) != index) { if (child == null || indexOf(child!) != index) {
...@@ -334,8 +336,9 @@ class RenderSliverList extends RenderSliverMultiBoxAdaptor { ...@@ -334,8 +336,9 @@ class RenderSliverList extends RenderSliverMultiBoxAdaptor {
// We may have started the layout while scrolled to the end, which would not // We may have started the layout while scrolled to the end, which would not
// expose a new child. // expose a new child.
if (estimatedMaxScrollOffset == endScrollOffset) if (estimatedMaxScrollOffset == endScrollOffset) {
childManager.setDidUnderflow(true); childManager.setDidUnderflow(true);
}
childManager.didFinishLayout(); childManager.didFinishLayout();
} }
} }
...@@ -198,8 +198,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -198,8 +198,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
@override @override
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
if (child.parentData is! SliverMultiBoxAdaptorParentData) if (child.parentData is! SliverMultiBoxAdaptorParentData) {
child.parentData = SliverMultiBoxAdaptorParentData(); child.parentData = SliverMultiBoxAdaptorParentData();
}
} }
/// The delegate that manages the children of this object. /// The delegate that manages the children of this object.
...@@ -240,8 +241,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -240,8 +241,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
void adoptChild(RenderObject child) { void adoptChild(RenderObject child) {
super.adoptChild(child); super.adoptChild(child);
final SliverMultiBoxAdaptorParentData childParentData = child.parentData! as SliverMultiBoxAdaptorParentData; final SliverMultiBoxAdaptorParentData childParentData = child.parentData! as SliverMultiBoxAdaptorParentData;
if (!childParentData._keptAlive) if (!childParentData._keptAlive) {
childManager.didAdoptChild(child as RenderBox); childManager.didAdoptChild(child as RenderBox);
}
} }
bool _debugAssertChildListLocked() => childManager.debugAssertChildListLocked(); bool _debugAssertChildListLocked() => childManager.debugAssertChildListLocked();
...@@ -304,8 +306,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -304,8 +306,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
// be moved to other index. In other cases, the existing child should have been // be moved to other index. In other cases, the existing child should have been
// removed by updateChild. Thus, it is ok to overwrite it. // removed by updateChild. Thus, it is ok to overwrite it.
assert(() { assert(() {
if (_keepAliveBucket.containsKey(childParentData.index)) if (_keepAliveBucket.containsKey(childParentData.index)) {
_debugDanglingKeepAlives.add(_keepAliveBucket[childParentData.index]!); _debugDanglingKeepAlives.add(_keepAliveBucket[childParentData.index]!);
}
return true; return true;
}()); }());
_keepAliveBucket[childParentData.index!] = child; _keepAliveBucket[childParentData.index!] = child;
...@@ -371,15 +374,17 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -371,15 +374,17 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
@override @override
void attach(PipelineOwner owner) { void attach(PipelineOwner owner) {
super.attach(owner); super.attach(owner);
for (final RenderBox child in _keepAliveBucket.values) for (final RenderBox child in _keepAliveBucket.values) {
child.attach(owner); child.attach(owner);
}
} }
@override @override
void detach() { void detach() {
super.detach(); super.detach();
for (final RenderBox child in _keepAliveBucket.values) for (final RenderBox child in _keepAliveBucket.values) {
child.detach(); child.detach();
}
} }
@override @override
...@@ -556,8 +561,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -556,8 +561,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
RenderBox? child = lastChild; RenderBox? child = lastChild;
final BoxHitTestResult boxResult = BoxHitTestResult.wrap(result); final BoxHitTestResult boxResult = BoxHitTestResult.wrap(result);
while (child != null) { while (child != null) {
if (hitTestBoxChild(boxResult, child, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition)) if (hitTestBoxChild(boxResult, child, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition)) {
return true; return true;
}
child = childBefore(child); child = childBefore(child);
} }
return false; return false;
...@@ -601,8 +607,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -601,8 +607,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (firstChild == null) if (firstChild == null) {
return; return;
}
// offset is to the top-left corner, regardless of our axis direction. // offset is to the top-left corner, regardless of our axis direction.
// originOffset gives us the delta from the real origin to the origin in the axis direction. // originOffset gives us the delta from the real origin to the origin in the axis direction.
final Offset mainAxisUnit, crossAxisUnit, originOffset; final Offset mainAxisUnit, crossAxisUnit, originOffset;
...@@ -643,13 +650,15 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -643,13 +650,15 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
originOffset.dx + mainAxisUnit.dx * mainAxisDelta + crossAxisUnit.dx * crossAxisDelta, originOffset.dx + mainAxisUnit.dx * mainAxisDelta + crossAxisUnit.dx * crossAxisDelta,
originOffset.dy + mainAxisUnit.dy * mainAxisDelta + crossAxisUnit.dy * crossAxisDelta, originOffset.dy + mainAxisUnit.dy * mainAxisDelta + crossAxisUnit.dy * crossAxisDelta,
); );
if (addExtent) if (addExtent) {
childOffset += mainAxisUnit * paintExtentOf(child); childOffset += mainAxisUnit * paintExtentOf(child);
}
// If the child's visible interval (mainAxisDelta, mainAxisDelta + paintExtentOf(child)) // If the child's visible interval (mainAxisDelta, mainAxisDelta + paintExtentOf(child))
// does not intersect the paint extent interval (0, constraints.remainingPaintExtent), it's hidden. // does not intersect the paint extent interval (0, constraints.remainingPaintExtent), it's hidden.
if (mainAxisDelta < constraints.remainingPaintExtent && mainAxisDelta + paintExtentOf(child) > 0) if (mainAxisDelta < constraints.remainingPaintExtent && mainAxisDelta + paintExtentOf(child) > 0) {
context.paintChild(child, childOffset); context.paintChild(child, childOffset);
}
child = childAfter(child); child = childAfter(child);
} }
...@@ -688,8 +697,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -688,8 +697,9 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
while (true) { while (true) {
final SliverMultiBoxAdaptorParentData childParentData = child!.parentData! as SliverMultiBoxAdaptorParentData; final SliverMultiBoxAdaptorParentData childParentData = child!.parentData! as SliverMultiBoxAdaptorParentData;
children.add(child.toDiagnosticsNode(name: 'child with index ${childParentData.index}')); children.add(child.toDiagnosticsNode(name: 'child with index ${childParentData.index}'));
if (child == lastChild) if (child == lastChild) {
break; break;
}
child = childParentData.nextSibling; child = childParentData.nextSibling;
} }
} }
......
...@@ -105,8 +105,9 @@ abstract class RenderSliverEdgeInsetsPadding extends RenderSliver with RenderObj ...@@ -105,8 +105,9 @@ abstract class RenderSliverEdgeInsetsPadding extends RenderSliver with RenderObj
@override @override
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
if (child.parentData is! SliverPhysicalParentData) if (child.parentData is! SliverPhysicalParentData) {
child.parentData = SliverPhysicalParentData(); child.parentData = SliverPhysicalParentData();
}
} }
@override @override
...@@ -326,8 +327,9 @@ class RenderSliverPadding extends RenderSliverEdgeInsetsPadding { ...@@ -326,8 +327,9 @@ class RenderSliverPadding extends RenderSliverEdgeInsetsPadding {
EdgeInsets? _resolvedPadding; EdgeInsets? _resolvedPadding;
void _resolve() { void _resolve() {
if (resolvedPadding != null) if (resolvedPadding != null) {
return; return;
}
_resolvedPadding = padding.resolve(textDirection); _resolvedPadding = padding.resolve(textDirection);
assert(resolvedPadding!.isNonNegative); assert(resolvedPadding!.isNonNegative);
} }
...@@ -346,8 +348,9 @@ class RenderSliverPadding extends RenderSliverEdgeInsetsPadding { ...@@ -346,8 +348,9 @@ class RenderSliverPadding extends RenderSliverEdgeInsetsPadding {
set padding(EdgeInsetsGeometry value) { set padding(EdgeInsetsGeometry value) {
assert(value != null); assert(value != null);
assert(padding.isNonNegative); assert(padding.isNonNegative);
if (_padding == value) if (_padding == value) {
return; return;
}
_padding = value; _padding = value;
_markNeedsResolution(); _markNeedsResolution();
} }
...@@ -359,8 +362,9 @@ class RenderSliverPadding extends RenderSliverEdgeInsetsPadding { ...@@ -359,8 +362,9 @@ class RenderSliverPadding extends RenderSliverEdgeInsetsPadding {
TextDirection? get textDirection => _textDirection; TextDirection? get textDirection => _textDirection;
TextDirection? _textDirection; TextDirection? _textDirection;
set textDirection(TextDirection? value) { set textDirection(TextDirection? value) {
if (_textDirection == value) if (_textDirection == value) {
return; return;
}
_textDirection = value; _textDirection = value;
_markNeedsResolution(); _markNeedsResolution();
} }
......
...@@ -149,8 +149,9 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje ...@@ -149,8 +149,9 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje
/// The dimension of the child in the main axis. /// The dimension of the child in the main axis.
@protected @protected
double get childExtent { double get childExtent {
if (child == null) if (child == null) {
return 0.0; return 0.0;
}
assert(child!.hasSize); assert(child!.hasSize);
assert(constraints.axis != null); assert(constraints.axis != null);
switch (constraints.axis) { switch (constraints.axis) {
...@@ -230,8 +231,9 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje ...@@ -230,8 +231,9 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje
} }
assert(minExtent != null); assert(minExtent != null);
assert(() { assert(() {
if (minExtent <= maxExtent) if (minExtent <= maxExtent) {
return true; return true;
}
throw FlutterError.fromParts(<DiagnosticsNode>[ throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary('The maxExtent for this $runtimeType is less than its minExtent.'), ErrorSummary('The maxExtent for this $runtimeType is less than its minExtent.'),
DoubleProperty('The specified maxExtent was', maxExtent), DoubleProperty('The specified maxExtent was', maxExtent),
...@@ -285,8 +287,9 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje ...@@ -285,8 +287,9 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje
@override @override
bool hitTestChildren(SliverHitTestResult result, { required double mainAxisPosition, required double crossAxisPosition }) { bool hitTestChildren(SliverHitTestResult result, { required double mainAxisPosition, required double crossAxisPosition }) {
assert(geometry!.hitTestExtent > 0.0); assert(geometry!.hitTestExtent > 0.0);
if (child != null) if (child != null) {
return hitTestBoxChild(BoxHitTestResult.wrap(result), child!, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition); return hitTestBoxChild(BoxHitTestResult.wrap(result), child!, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition);
}
return false; return false;
} }
...@@ -549,8 +552,9 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste ...@@ -549,8 +552,9 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste
TickerProvider? get vsync => _vsync; TickerProvider? get vsync => _vsync;
TickerProvider? _vsync; TickerProvider? _vsync;
set vsync(TickerProvider? value) { set vsync(TickerProvider? value) {
if (value == _vsync) if (value == _vsync) {
return; return;
}
_vsync = value; _vsync = value;
if (value == null) { if (value == null) {
_controller?.dispose(); _controller?.dispose();
...@@ -615,8 +619,9 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste ...@@ -615,8 +619,9 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste
final AnimationController effectiveController = final AnimationController effectiveController =
_controller ??= AnimationController(vsync: vsync!, duration: duration) _controller ??= AnimationController(vsync: vsync!, duration: duration)
..addListener(() { ..addListener(() {
if (_effectiveScrollOffset == _animation.value) if (_effectiveScrollOffset == _animation.value) {
return; return;
}
_effectiveScrollOffset = _animation.value; _effectiveScrollOffset = _animation.value;
markNeedsLayout(); markNeedsLayout();
}); });
...@@ -638,12 +643,15 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste ...@@ -638,12 +643,15 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste
/// If the header isn't already fully exposed, then scroll it into view. /// If the header isn't already fully exposed, then scroll it into view.
void maybeStartSnapAnimation(ScrollDirection direction) { void maybeStartSnapAnimation(ScrollDirection direction) {
final FloatingHeaderSnapConfiguration? snap = snapConfiguration; final FloatingHeaderSnapConfiguration? snap = snapConfiguration;
if (snap == null) if (snap == null) {
return; return;
if (direction == ScrollDirection.forward && _effectiveScrollOffset! <= 0.0) }
if (direction == ScrollDirection.forward && _effectiveScrollOffset! <= 0.0) {
return; return;
if (direction == ScrollDirection.reverse && _effectiveScrollOffset! >= maxExtent) }
if (direction == ScrollDirection.reverse && _effectiveScrollOffset! >= maxExtent) {
return; return;
}
_updateAnimation( _updateAnimation(
snap.duration, snap.duration,
...@@ -671,11 +679,15 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste ...@@ -671,11 +679,15 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste
final bool allowFloatingExpansion = constraints.userScrollDirection == ScrollDirection.forward final bool allowFloatingExpansion = constraints.userScrollDirection == ScrollDirection.forward
|| (_lastStartedScrollDirection != null && _lastStartedScrollDirection == ScrollDirection.forward); || (_lastStartedScrollDirection != null && _lastStartedScrollDirection == ScrollDirection.forward);
if (allowFloatingExpansion) { if (allowFloatingExpansion) {
if (_effectiveScrollOffset! > maxExtent) // We're scrolled off-screen, but should reveal, so if (_effectiveScrollOffset! > maxExtent) {
_effectiveScrollOffset = maxExtent; // pretend we're just at the limit. // We're scrolled off-screen, but should reveal, so pretend we're just at the limit.
_effectiveScrollOffset = maxExtent;
}
} else { } else {
if (delta > 0.0) // If we are trying to expand when allowFloatingExpansion is false, if (delta > 0.0) {
delta = 0.0; // disallow the expansion. (But allow shrinking, i.e. delta < 0.0 is fine.) // Disallow the expansion. (But allow shrinking, i.e. delta < 0.0 is fine.)
delta = 0.0;
}
} }
_effectiveScrollOffset = clampDouble(_effectiveScrollOffset! - delta, 0.0, constraints.scrollOffset); _effectiveScrollOffset = clampDouble(_effectiveScrollOffset! - delta, 0.0, constraints.scrollOffset);
} else { } else {
...@@ -700,8 +712,9 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste ...@@ -700,8 +712,9 @@ abstract class RenderSliverFloatingPersistentHeader extends RenderSliverPersiste
Curve curve = Curves.ease, Curve curve = Curves.ease,
}) { }) {
final PersistentHeaderShowOnScreenConfiguration? showOnScreen = showOnScreenConfiguration; final PersistentHeaderShowOnScreenConfiguration? showOnScreen = showOnScreenConfiguration;
if (showOnScreen == null) if (showOnScreen == null) {
return super.showOnScreen(descendant: descendant, rect: rect, duration: duration, curve: curve); return super.showOnScreen(descendant: descendant, rect: rect, duration: duration, curve: curve);
}
assert(child != null || descendant == null); assert(child != null || descendant == null);
// We prefer the child's coordinate space (instead of the sliver's) because // We prefer the child's coordinate space (instead of the sliver's) because
......
...@@ -136,10 +136,12 @@ class RelativeRect { ...@@ -136,10 +136,12 @@ class RelativeRect {
/// {@macro dart.ui.shadow.lerp} /// {@macro dart.ui.shadow.lerp}
static RelativeRect? lerp(RelativeRect? a, RelativeRect? b, double t) { static RelativeRect? lerp(RelativeRect? a, RelativeRect? b, double t) {
assert(t != null); assert(t != null);
if (a == null && b == null) if (a == null && b == null) {
return null; return null;
if (a == null) }
if (a == null) {
return RelativeRect.fromLTRB(b!.left * t, b.top * t, b.right * t, b.bottom * t); return RelativeRect.fromLTRB(b!.left * t, b.top * t, b.right * t, b.bottom * t);
}
if (b == null) { if (b == null) {
final double k = 1.0 - t; final double k = 1.0 - t;
return RelativeRect.fromLTRB(b!.left * k, b.top * k, b.right * k, b.bottom * k); return RelativeRect.fromLTRB(b!.left * k, b.top * k, b.right * k, b.bottom * k);
...@@ -154,8 +156,9 @@ class RelativeRect { ...@@ -154,8 +156,9 @@ class RelativeRect {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(this, other)) if (identical(this, other)) {
return true; return true;
}
return other is RelativeRect return other is RelativeRect
&& other.left == left && other.left == left
&& other.top == top && other.top == top
...@@ -221,8 +224,9 @@ class StackParentData extends ContainerBoxParentData<RenderBox> { ...@@ -221,8 +224,9 @@ class StackParentData extends ContainerBoxParentData<RenderBox> {
if (width != null) 'width=${debugFormatDouble(width)}', if (width != null) 'width=${debugFormatDouble(width)}',
if (height != null) 'height=${debugFormatDouble(height)}', if (height != null) 'height=${debugFormatDouble(height)}',
]; ];
if (values.isEmpty) if (values.isEmpty) {
values.add('not positioned'); values.add('not positioned');
}
values.add(super.toString()); values.add(super.toString());
return values.join('; '); return values.join('; ');
} }
...@@ -333,15 +337,17 @@ class RenderStack extends RenderBox ...@@ -333,15 +337,17 @@ class RenderStack extends RenderBox
@override @override
void setupParentData(RenderBox child) { void setupParentData(RenderBox child) {
if (child.parentData is! StackParentData) if (child.parentData is! StackParentData) {
child.parentData = StackParentData(); child.parentData = StackParentData();
}
} }
Alignment? _resolvedAlignment; Alignment? _resolvedAlignment;
void _resolve() { void _resolve() {
if (_resolvedAlignment != null) if (_resolvedAlignment != null) {
return; return;
}
_resolvedAlignment = alignment.resolve(textDirection); _resolvedAlignment = alignment.resolve(textDirection);
} }
...@@ -369,8 +375,9 @@ class RenderStack extends RenderBox ...@@ -369,8 +375,9 @@ class RenderStack extends RenderBox
AlignmentGeometry _alignment; AlignmentGeometry _alignment;
set alignment(AlignmentGeometry value) { set alignment(AlignmentGeometry value) {
assert(value != null); assert(value != null);
if (_alignment == value) if (_alignment == value) {
return; return;
}
_alignment = value; _alignment = value;
_markNeedResolution(); _markNeedResolution();
} }
...@@ -382,8 +389,9 @@ class RenderStack extends RenderBox ...@@ -382,8 +389,9 @@ class RenderStack extends RenderBox
TextDirection? get textDirection => _textDirection; TextDirection? get textDirection => _textDirection;
TextDirection? _textDirection; TextDirection? _textDirection;
set textDirection(TextDirection? value) { set textDirection(TextDirection? value) {
if (_textDirection == value) if (_textDirection == value) {
return; return;
}
_textDirection = value; _textDirection = value;
_markNeedResolution(); _markNeedResolution();
} }
...@@ -423,8 +431,9 @@ class RenderStack extends RenderBox ...@@ -423,8 +431,9 @@ class RenderStack extends RenderBox
RenderBox? child = firstChild; RenderBox? child = firstChild;
while (child != null) { while (child != null) {
final StackParentData childParentData = child.parentData! as StackParentData; final StackParentData childParentData = child.parentData! as StackParentData;
if (!childParentData.isPositioned) if (!childParentData.isPositioned) {
extent = math.max(extent, mainChildSizeGetter(child)); extent = math.max(extent, mainChildSizeGetter(child));
}
assert(child.parentData == childParentData); assert(child.parentData == childParentData);
child = childParentData.nextSibling; child = childParentData.nextSibling;
} }
...@@ -466,15 +475,17 @@ class RenderStack extends RenderBox ...@@ -466,15 +475,17 @@ class RenderStack extends RenderBox
bool hasVisualOverflow = false; bool hasVisualOverflow = false;
BoxConstraints childConstraints = const BoxConstraints(); BoxConstraints childConstraints = const BoxConstraints();
if (childParentData.left != null && childParentData.right != null) if (childParentData.left != null && childParentData.right != null) {
childConstraints = childConstraints.tighten(width: size.width - childParentData.right! - childParentData.left!); childConstraints = childConstraints.tighten(width: size.width - childParentData.right! - childParentData.left!);
else if (childParentData.width != null) } else if (childParentData.width != null) {
childConstraints = childConstraints.tighten(width: childParentData.width); childConstraints = childConstraints.tighten(width: childParentData.width);
}
if (childParentData.top != null && childParentData.bottom != null) if (childParentData.top != null && childParentData.bottom != null) {
childConstraints = childConstraints.tighten(height: size.height - childParentData.bottom! - childParentData.top!); childConstraints = childConstraints.tighten(height: size.height - childParentData.bottom! - childParentData.top!);
else if (childParentData.height != null) } else if (childParentData.height != null) {
childConstraints = childConstraints.tighten(height: childParentData.height); childConstraints = childConstraints.tighten(height: childParentData.height);
}
child.layout(childConstraints, parentUsesSize: true); child.layout(childConstraints, parentUsesSize: true);
...@@ -487,8 +498,9 @@ class RenderStack extends RenderBox ...@@ -487,8 +498,9 @@ class RenderStack extends RenderBox
x = alignment.alongOffset(size - child.size as Offset).dx; x = alignment.alongOffset(size - child.size as Offset).dx;
} }
if (x < 0.0 || x + child.size.width > size.width) if (x < 0.0 || x + child.size.width > size.width) {
hasVisualOverflow = true; hasVisualOverflow = true;
}
final double y; final double y;
if (childParentData.top != null) { if (childParentData.top != null) {
...@@ -499,8 +511,9 @@ class RenderStack extends RenderBox ...@@ -499,8 +511,9 @@ class RenderStack extends RenderBox
y = alignment.alongOffset(size - child.size as Offset).dy; y = alignment.alongOffset(size - child.size as Offset).dy;
} }
if (y < 0.0 || y + child.size.height > size.height) if (y < 0.0 || y + child.size.height > size.height) {
hasVisualOverflow = true; hasVisualOverflow = true;
}
childParentData.offset = Offset(x, y); childParentData.offset = Offset(x, y);
...@@ -675,8 +688,9 @@ class RenderIndexedStack extends RenderStack { ...@@ -675,8 +688,9 @@ class RenderIndexedStack extends RenderStack {
@override @override
void visitChildrenForSemantics(RenderObjectVisitor visitor) { void visitChildrenForSemantics(RenderObjectVisitor visitor) {
if (index != null && firstChild != null) if (index != null && firstChild != null) {
visitor(_childAtIndex()); visitor(_childAtIndex());
}
} }
/// The index of the child to show, null if nothing is to be displayed. /// The index of the child to show, null if nothing is to be displayed.
...@@ -705,8 +719,9 @@ class RenderIndexedStack extends RenderStack { ...@@ -705,8 +719,9 @@ class RenderIndexedStack extends RenderStack {
@override @override
bool hitTestChildren(BoxHitTestResult result, { required Offset position }) { bool hitTestChildren(BoxHitTestResult result, { required Offset position }) {
if (firstChild == null || index == null) if (firstChild == null || index == null) {
return false; return false;
}
assert(position != null); assert(position != null);
final RenderBox child = _childAtIndex(); final RenderBox child = _childAtIndex();
final StackParentData childParentData = child.parentData! as StackParentData; final StackParentData childParentData = child.parentData! as StackParentData;
...@@ -722,8 +737,9 @@ class RenderIndexedStack extends RenderStack { ...@@ -722,8 +737,9 @@ class RenderIndexedStack extends RenderStack {
@override @override
void paintStack(PaintingContext context, Offset offset) { void paintStack(PaintingContext context, Offset offset) {
if (firstChild == null || index == null) if (firstChild == null || index == null) {
return; return;
}
final RenderBox child = _childAtIndex(); final RenderBox child = _childAtIndex();
final StackParentData childParentData = child.parentData! as StackParentData; final StackParentData childParentData = child.parentData! as StackParentData;
context.paintChild(child, childParentData.offset + offset); context.paintChild(child, childParentData.offset + offset);
......
...@@ -99,24 +99,27 @@ class TableBorder { ...@@ -99,24 +99,27 @@ class TableBorder {
bottom.color != topColor || bottom.color != topColor ||
left.color != topColor || left.color != topColor ||
horizontalInside.color != topColor || horizontalInside.color != topColor ||
verticalInside.color != topColor) verticalInside.color != topColor) {
return false; return false;
}
final double topWidth = top.width; final double topWidth = top.width;
if (right.width != topWidth || if (right.width != topWidth ||
bottom.width != topWidth || bottom.width != topWidth ||
left.width != topWidth || left.width != topWidth ||
horizontalInside.width != topWidth || horizontalInside.width != topWidth ||
verticalInside.width != topWidth) verticalInside.width != topWidth) {
return false; return false;
}
final BorderStyle topStyle = top.style; final BorderStyle topStyle = top.style;
if (right.style != topStyle || if (right.style != topStyle ||
bottom.style != topStyle || bottom.style != topStyle ||
left.style != topStyle || left.style != topStyle ||
horizontalInside.style != topStyle || horizontalInside.style != topStyle ||
verticalInside.style != topStyle) verticalInside.style != topStyle) {
return false; return false;
}
return true; return true;
} }
...@@ -155,12 +158,15 @@ class TableBorder { ...@@ -155,12 +158,15 @@ class TableBorder {
/// {@macro dart.ui.shadow.lerp} /// {@macro dart.ui.shadow.lerp}
static TableBorder? lerp(TableBorder? a, TableBorder? b, double t) { static TableBorder? lerp(TableBorder? a, TableBorder? b, double t) {
assert(t != null); assert(t != null);
if (a == null && b == null) if (a == null && b == null) {
return null; return null;
if (a == null) }
if (a == null) {
return b!.scale(t); return b!.scale(t);
if (b == null) }
if (b == null) {
return a.scale(1.0 - t); return a.scale(1.0 - t);
}
return TableBorder( return TableBorder(
top: BorderSide.lerp(a.top, b.top, t), top: BorderSide.lerp(a.top, b.top, t),
right: BorderSide.lerp(a.right, b.right, t), right: BorderSide.lerp(a.right, b.right, t),
...@@ -261,9 +267,9 @@ class TableBorder { ...@@ -261,9 +267,9 @@ class TableBorder {
} }
} }
} }
if(!isUniform || borderRadius == BorderRadius.zero) if(!isUniform || borderRadius == BorderRadius.zero) {
paintBorder(canvas, rect, top: top, right: right, bottom: bottom, left: left); paintBorder(canvas, rect, top: top, right: right, bottom: bottom, left: left);
else { } else {
final RRect outer = borderRadius.toRRect(rect); final RRect outer = borderRadius.toRRect(rect);
final RRect inner = outer.deflate(top.width); final RRect inner = outer.deflate(top.width);
final Paint paint = Paint()..color = top.color; final Paint paint = Paint()..color = top.color;
...@@ -273,10 +279,12 @@ class TableBorder { ...@@ -273,10 +279,12 @@ class TableBorder {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(this, other)) if (identical(this, other)) {
return true; return true;
if (other.runtimeType != runtimeType) }
if (other.runtimeType != runtimeType) {
return false; return false;
}
return other is TableBorder return other is TableBorder
&& other.top == top && other.top == top
&& other.right == right && other.right == right
......
...@@ -40,8 +40,9 @@ class ViewConfiguration { ...@@ -40,8 +40,9 @@ class ViewConfiguration {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (other.runtimeType != runtimeType) if (other.runtimeType != runtimeType) {
return false; return false;
}
return other is ViewConfiguration return other is ViewConfiguration
&& other.size == size && other.size == size
&& other.devicePixelRatio == devicePixelRatio; && other.devicePixelRatio == devicePixelRatio;
...@@ -89,8 +90,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -89,8 +90,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
/// Always call [prepareInitialFrame] before changing the configuration. /// Always call [prepareInitialFrame] before changing the configuration.
set configuration(ViewConfiguration value) { set configuration(ViewConfiguration value) {
assert(value != null); assert(value != null);
if (configuration == value) if (configuration == value) {
return; return;
}
final ViewConfiguration oldConfiguration = _configuration; final ViewConfiguration oldConfiguration = _configuration;
_configuration = value; _configuration = value;
if (oldConfiguration.toMatrix() != _configuration.toMatrix()) { if (oldConfiguration.toMatrix() != _configuration.toMatrix()) {
...@@ -165,8 +167,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -165,8 +167,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
_size = configuration.size; _size = configuration.size;
assert(_size.isFinite); assert(_size.isFinite);
if (child != null) if (child != null) {
child!.layout(BoxConstraints.tight(_size)); child!.layout(BoxConstraints.tight(_size));
}
} }
/// Determines the set of render objects located at the given position. /// Determines the set of render objects located at the given position.
...@@ -180,8 +183,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -180,8 +183,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
/// coordinate system as that expected by the root [Layer], which will /// coordinate system as that expected by the root [Layer], which will
/// normally be in physical (device) pixels. /// normally be in physical (device) pixels.
bool hitTest(HitTestResult result, { required Offset position }) { bool hitTest(HitTestResult result, { required Offset position }) {
if (child != null) if (child != null) {
child!.hitTest(BoxHitTestResult.wrap(result), position: position); child!.hitTest(BoxHitTestResult.wrap(result), position: position);
}
result.add(HitTestEntry(this)); result.add(HitTestEntry(this));
return true; return true;
} }
...@@ -204,8 +208,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -204,8 +208,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (child != null) if (child != null) {
context.paintChild(child!, offset); context.paintChild(child!, offset);
}
} }
@override @override
...@@ -225,13 +230,15 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -225,13 +230,15 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
try { try {
final ui.SceneBuilder builder = ui.SceneBuilder(); final ui.SceneBuilder builder = ui.SceneBuilder();
final ui.Scene scene = layer!.buildScene(builder); final ui.Scene scene = layer!.buildScene(builder);
if (automaticSystemUiAdjustment) if (automaticSystemUiAdjustment) {
_updateSystemChrome(); _updateSystemChrome();
}
_window.render(scene); _window.render(scene);
scene.dispose(); scene.dispose();
assert(() { assert(() {
if (debugRepaintRainbowEnabled || debugRepaintTextRainbowEnabled) if (debugRepaintRainbowEnabled || debugRepaintTextRainbowEnabled) {
debugCurrentRepaintColor = debugCurrentRepaintColor.withHue((debugCurrentRepaintColor.hue + 2.0) % 360.0); debugCurrentRepaintColor = debugCurrentRepaintColor.withHue((debugCurrentRepaintColor.hue + 2.0) % 360.0);
}
return true; return true;
}()); }());
} finally { } finally {
...@@ -334,7 +341,8 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox> ...@@ -334,7 +341,8 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
properties.add(DiagnosticsProperty<Size>('window size', _window.physicalSize, tooltip: 'in physical pixels')); properties.add(DiagnosticsProperty<Size>('window size', _window.physicalSize, tooltip: 'in physical pixels'));
properties.add(DoubleProperty('device pixel ratio', _window.devicePixelRatio, tooltip: 'physical pixels per logical pixel')); properties.add(DoubleProperty('device pixel ratio', _window.devicePixelRatio, tooltip: 'physical pixels per logical pixel'));
properties.add(DiagnosticsProperty<ViewConfiguration>('configuration', configuration, tooltip: 'in logical pixels')); properties.add(DiagnosticsProperty<ViewConfiguration>('configuration', configuration, tooltip: 'in logical pixels'));
if (_window.platformDispatcher.semanticsEnabled) if (_window.platformDispatcher.semanticsEnabled) {
properties.add(DiagnosticsNode.message('semantics enabled')); properties.add(DiagnosticsNode.message('semantics enabled'));
}
} }
} }
...@@ -899,8 +899,9 @@ void main() { ...@@ -899,8 +899,9 @@ void main() {
editable.paintCount = 0; editable.paintCount = 0;
final AbstractNode? parent = editable.parent; final AbstractNode? parent = editable.parent;
if (parent is RenderConstrainedBox) if (parent is RenderConstrainedBox) {
parent.child = null; parent.child = null;
}
}); });
test('paints in the correct order', () { test('paints in the correct order', () {
......
...@@ -858,10 +858,12 @@ class _TestAnnotatedLayer extends Layer { ...@@ -858,10 +858,12 @@ class _TestAnnotatedLayer extends Layer {
Offset localPosition, { Offset localPosition, {
required bool onlyFirst, required bool onlyFirst,
}) { }) {
if (S != int) if (S != int) {
return false; return false;
if (size != null && !(offset & size!).contains(localPosition)) }
if (size != null && !(offset & size!).contains(localPosition)) {
return false; return false;
}
final Object untypedValue = value; final Object untypedValue = value;
final S typedValue = untypedValue as S; final S typedValue = untypedValue as S;
result.add(AnnotationEntry<S>(annotation: typedValue, localPosition: localPosition)); result.add(AnnotationEntry<S>(annotation: typedValue, localPosition: localPosition));
......
...@@ -463,10 +463,12 @@ class _CursorUpdateDetails extends MethodCall { ...@@ -463,10 +463,12 @@ class _CursorUpdateDetails extends MethodCall {
@override @override
bool operator ==(dynamic other) { bool operator ==(dynamic other) {
if (identical(other, this)) if (identical(other, this)) {
return true; return true;
if (other.runtimeType != runtimeType) }
if (other.runtimeType != runtimeType) {
return false; return false;
}
return other is _CursorUpdateDetails return other is _CursorUpdateDetails
&& other.method == method && other.method == method
&& other.arguments.length == arguments.length && other.arguments.length == arguments.length
......
...@@ -43,16 +43,19 @@ void main() { ...@@ -43,16 +43,19 @@ void main() {
}) { }) {
final TestAnnotationTarget oneAnnotation = TestAnnotationTarget( final TestAnnotationTarget oneAnnotation = TestAnnotationTarget(
onEnter: (PointerEnterEvent event) { onEnter: (PointerEnterEvent event) {
if (logEvents != null) if (logEvents != null) {
logEvents.add(event); logEvents.add(event);
}
}, },
onHover: (PointerHoverEvent event) { onHover: (PointerHoverEvent event) {
if (logEvents != null) if (logEvents != null) {
logEvents.add(event); logEvents.add(event);
}
}, },
onExit: (PointerExitEvent event) { onExit: (PointerExitEvent event) {
if (logEvents != null) if (logEvents != null) {
logEvents.add(event); logEvents.add(event);
}
}, },
); );
setUpMouseAnnotationFinder( setUpMouseAnnotationFinder(
...@@ -458,10 +461,11 @@ void main() { ...@@ -458,10 +461,11 @@ void main() {
onExit: (PointerExitEvent event) {}, onExit: (PointerExitEvent event) {},
); );
setUpMouseAnnotationFinder((Offset position) sync* { setUpMouseAnnotationFinder((Offset position) sync* {
if (isInHitRegionOne) if (isInHitRegionOne) {
yield TestAnnotationEntry(annotation1); yield TestAnnotationEntry(annotation1);
else if (isInHitRegionTwo) } else if (isInHitRegionTwo) {
yield TestAnnotationEntry(annotation2); yield TestAnnotationEntry(annotation2);
}
}); });
isInHitRegionOne = false; isInHitRegionOne = false;
...@@ -694,12 +698,14 @@ class _EventListCriticalFieldsMatcher extends Matcher { ...@@ -694,12 +698,14 @@ class _EventListCriticalFieldsMatcher extends Matcher {
@override @override
bool matches(dynamic untypedItem, Map<dynamic, dynamic> matchState) { bool matches(dynamic untypedItem, Map<dynamic, dynamic> matchState) {
if (untypedItem is! Iterable<PointerEvent>) if (untypedItem is! Iterable<PointerEvent>) {
return false; return false;
}
final Iterable<PointerEvent> item = untypedItem; final Iterable<PointerEvent> item = untypedItem;
final Iterator<PointerEvent> iterator = item.iterator; final Iterator<PointerEvent> iterator = item.iterator;
if (item.length != _expected.length) if (item.length != _expected.length) {
return false; return false;
}
int i = 0; int i = 0;
for (final BaseEventMatcher matcher in _expected) { for (final BaseEventMatcher matcher in _expected) {
iterator.moveNext(); iterator.moveNext();
......
...@@ -89,8 +89,9 @@ class TestAnnotationTarget with Diagnosticable implements MouseTrackerAnnotation ...@@ -89,8 +89,9 @@ class TestAnnotationTarget with Diagnosticable implements MouseTrackerAnnotation
@override @override
void handleEvent(PointerEvent event, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
if (event is PointerHoverEvent) if (event is PointerHoverEvent) {
onHover?.call(event); onHover?.call(event);
}
} }
} }
......
...@@ -208,8 +208,9 @@ class _MethodCall implements Invocation { ...@@ -208,8 +208,9 @@ class _MethodCall implements Invocation {
} }
String _valueName(Object? value) { String _valueName(Object? value) {
if (value is double) if (value is double) {
return value.toStringAsFixed(1); return value.toStringAsFixed(1);
}
return value.toString(); return value.toString();
} }
......
...@@ -49,8 +49,9 @@ class TestRenderingFlutterBinding extends BindingBase with SchedulerBinding, Ser ...@@ -49,8 +49,9 @@ class TestRenderingFlutterBinding extends BindingBase with SchedulerBinding, Ser
/// idempotent; calling it a second time will just return the /// idempotent; calling it a second time will just return the
/// previously-created instance. /// previously-created instance.
static TestRenderingFlutterBinding ensureInitialized({ VoidCallback? onErrors }) { static TestRenderingFlutterBinding ensureInitialized({ VoidCallback? onErrors }) {
if (_instance != null) if (_instance != null) {
return _instance!; return _instance!;
}
return TestRenderingFlutterBinding(onErrors: onErrors); return TestRenderingFlutterBinding(onErrors: onErrors);
} }
...@@ -143,20 +144,25 @@ class TestRenderingFlutterBinding extends BindingBase with SchedulerBinding, Ser ...@@ -143,20 +144,25 @@ class TestRenderingFlutterBinding extends BindingBase with SchedulerBinding, Ser
}; };
try { try {
pipelineOwner.flushLayout(); pipelineOwner.flushLayout();
if (phase == EnginePhase.layout) if (phase == EnginePhase.layout) {
return; return;
}
pipelineOwner.flushCompositingBits(); pipelineOwner.flushCompositingBits();
if (phase == EnginePhase.compositingBits) if (phase == EnginePhase.compositingBits) {
return; return;
}
pipelineOwner.flushPaint(); pipelineOwner.flushPaint();
if (phase == EnginePhase.paint) if (phase == EnginePhase.paint) {
return; return;
}
renderView.compositeFrame(); renderView.compositeFrame();
if (phase == EnginePhase.composite) if (phase == EnginePhase.composite) {
return; return;
}
pipelineOwner.flushSemantics(); pipelineOwner.flushSemantics();
if (phase == EnginePhase.flushSemantics) if (phase == EnginePhase.flushSemantics) {
return; return;
}
assert(phase == EnginePhase.flushSemantics || phase == EnginePhase.sendSemanticsUpdate); assert(phase == EnginePhase.flushSemantics || phase == EnginePhase.sendSemanticsUpdate);
} finally { } finally {
FlutterError.onError = oldErrorHandler; FlutterError.onError = oldErrorHandler;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment