Fix (insert|move|remove)RenderObjectChild methods in base class (#123276)

This commit is contained in:
Michael Goderbauer 2023-03-23 12:34:26 -07:00 committed by GitHub
parent 31798757e7
commit 7f41ab25c9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 95 deletions

View file

@ -856,7 +856,7 @@ class _CupertinoDialogRenderElement extends RenderObjectElement {
@override @override
void moveRenderObjectChild(RenderObject child, _AlertDialogSections oldSlot, _AlertDialogSections newSlot) { void moveRenderObjectChild(RenderObject child, _AlertDialogSections oldSlot, _AlertDialogSections newSlot) {
if (!allowMoveRenderObjectChild) { if (!allowMoveRenderObjectChild) {
super.moveRenderObjectChild(child, oldSlot, newSlot); assert(false);
return; return;
} }

View file

@ -6290,30 +6290,7 @@ abstract class RenderObjectElement extends Element {
/// [IndexedSlot] is a convenient value for the slot. /// [IndexedSlot] is a convenient value for the slot.
/// {@endtemplate} /// {@endtemplate}
@protected @protected
void insertRenderObjectChild(covariant RenderObject child, covariant Object? slot) { void insertRenderObjectChild(covariant RenderObject child, covariant Object? slot);
assert(() {
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary('RenderObjectElement.insertChildRenderObject() is deprecated.'),
toDiagnosticsNode(
name: 'insertChildRenderObject() was called on this Element',
style: DiagnosticsTreeStyle.shallow,
),
ErrorDescription(
'insertChildRenderObject() has been deprecated in favor of '
'insertRenderObjectChild(). See https://github.com/flutter/flutter/issues/63269 '
'for details.',
),
ErrorHint(
'Rather than overriding insertChildRenderObject() in your '
'RenderObjectElement subclass, override insertRenderObjectChild() instead, '
"and DON'T call super.insertRenderObjectChild(). If you're implementing a "
'new RenderObjectElement, you should override/implement '
'insertRenderObjectChild(), moveRenderObjectChild(), and '
'removeRenderObjectChild().',
),
]);
}());
}
/// Move the given child from the given old slot to the given new slot. /// Move the given child from the given old slot to the given new slot.
/// ///
@ -6330,60 +6307,14 @@ abstract class RenderObjectElement extends Element {
/// compared against each other for the purposes of updating one slot with the /// compared against each other for the purposes of updating one slot with the
/// element from another slot) would never call this. /// element from another slot) would never call this.
@protected @protected
void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot) { void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot);
assert(() {
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary('RenderObjectElement.moveChildRenderObject() is deprecated.'),
toDiagnosticsNode(
name: 'super.moveChildRenderObject() was called on this Element',
style: DiagnosticsTreeStyle.shallow,
),
ErrorDescription(
'moveChildRenderObject() has been deprecated in favor of '
'moveRenderObjectChild(). See https://github.com/flutter/flutter/issues/63269 '
'for details.',
),
ErrorHint(
'Rather than overriding moveChildRenderObject() in your '
'RenderObjectElement subclass, override moveRenderObjectChild() instead, '
"and DON'T call super.moveRenderObjectChild(). If you're implementing a "
'new RenderObjectElement, you should override/implement '
'insertRenderObjectChild(), moveRenderObjectChild(), and '
'removeRenderObjectChild().',
),
]);
}());
}
/// Remove the given child from [renderObject]. /// Remove the given child from [renderObject].
/// ///
/// The given child is guaranteed to have been inserted at the given `slot` /// The given child is guaranteed to have been inserted at the given `slot`
/// and have [renderObject] as its parent. /// and have [renderObject] as its parent.
@protected @protected
void removeRenderObjectChild(covariant RenderObject child, covariant Object? slot) { void removeRenderObjectChild(covariant RenderObject child, covariant Object? slot);
assert(() {
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary('RenderObjectElement.removeChildRenderObject() is deprecated.'),
toDiagnosticsNode(
name: 'super.removeChildRenderObject() was called on this Element',
style: DiagnosticsTreeStyle.shallow,
),
ErrorDescription(
'removeChildRenderObject() has been deprecated in favor of '
'removeRenderObjectChild(). See https://github.com/flutter/flutter/issues/63269 '
'for details.',
),
ErrorHint(
'Rather than overriding removeChildRenderObject() in your '
'RenderObjectElement subclass, override removeRenderObjectChild() instead, '
"and DON'T call super.removeRenderObjectChild(). If you're implementing a "
'new RenderObjectElement, you should override/implement '
'insertRenderObjectChild(), moveRenderObjectChild(), and '
'removeRenderObjectChild().',
),
]);
}());
}
@override @override
void debugFillProperties(DiagnosticPropertiesBuilder properties) { void debugFillProperties(DiagnosticPropertiesBuilder properties) {

View file

@ -2119,6 +2119,15 @@ class FakeLeafRenderObject extends RenderBox {
class TestRenderObjectElement extends RenderObjectElement { class TestRenderObjectElement extends RenderObjectElement {
TestRenderObjectElement() : super(Table()); TestRenderObjectElement() : super(Table());
@override
void insertRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
@override
void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot) { }
@override
void removeRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
} }
class _EmptyWidget extends Widget { class _EmptyWidget extends Widget {

View file

@ -66,6 +66,15 @@ class _TestElement extends RootRenderObjectElement{
mount(null, null); mount(null, null);
deactivate(); deactivate();
} }
@override
void insertRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
@override
void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot) { }
@override
void removeRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
} }
class _TestRenderObject extends RenderObject { class _TestRenderObject extends RenderObject {

View file

@ -105,6 +105,15 @@ abstract class SwapperElement extends RenderObjectElement {
swapper = updateChild(swapper, widget.swapper, swapperIsOnTop); swapper = updateChild(swapper, widget.swapper, swapperIsOnTop);
swapperIsOnTop = !swapperIsOnTop; swapperIsOnTop = !swapperIsOnTop;
} }
@override
void insertRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
@override
void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot) { }
@override
void removeRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
} }
class SwapperElementWithProperOverrides extends SwapperElement { class SwapperElementWithProperOverrides extends SwapperElement {
@ -288,26 +297,4 @@ void main() {
expect(swapper.removeSlots, contains('stable')); expect(swapper.removeSlots, contains('stable'));
expect(swapper.removeSlots, contains(false)); expect(swapper.removeSlots, contains(false));
}); });
testWidgets('RenderObjectElement *ChildRenderObject methods fail with deprecation message', (WidgetTester tester) async {
const Key redKey = ValueKey<String>('red');
const Key blueKey = ValueKey<String>('blue');
Widget widget() {
return SwapperWithNoOverrides(
stable: ColoredBox(
key: redKey,
color: Color(nonconst(0xffff0000)),
),
swapper: ColoredBox(
key: blueKey,
color: Color(nonconst(0xff0000ff)),
),
);
}
await tester.pumpWidget(widget());
final FlutterError error = tester.takeException() as FlutterError;
final ErrorSummary summary = error.diagnostics.first as ErrorSummary;
expect(summary.toString(), contains('deprecated'));
});
} }

View file

@ -63,6 +63,15 @@ class _TestElement extends RootRenderObjectElement{
mount(null, null); mount(null, null);
deactivate(); deactivate();
} }
@override
void insertRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
@override
void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot) { }
@override
void removeRenderObjectChild(covariant RenderObject child, covariant Object? slot) { }
} }
class _MyStatefulWidget extends StatefulWidget { class _MyStatefulWidget extends StatefulWidget {