Generalize _cleanRelayoutSubtreeRootChildren into visitChildren

This generalization will let us implement other alogorithims that need to walk
the RenderObject tree.
This commit is contained in:
Adam Barth 2015-08-14 09:37:19 -07:00
parent 0c05c97e20
commit 53884a37de
2 changed files with 19 additions and 6 deletions

View File

@ -90,6 +90,7 @@ abstract class Constraints {
bool get isTight;
}
typedef void RenderObjectVisitor(RenderObject child);
typedef void LayoutCallback(Constraints constraints);
abstract class RenderObject extends AbstractNode implements HitTestTarget {
@ -125,6 +126,9 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
markNeedsLayout();
}
// Override in subclasses with children and call the visitor for each child.
void visitChildren(RenderObjectVisitor visitor) { }
static bool _debugDoingLayout = false;
static bool get debugDoingLayout => _debugDoingLayout;
bool _debugDoingThisResize = false;
@ -193,10 +197,11 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
if (_relayoutSubtreeRoot != this) {
_relayoutSubtreeRoot = null;
_needsLayout = true;
_cleanRelayoutSubtreeRootChildren();
visitChildren((RenderObject child) {
child._cleanRelayoutSubtreeRoot();
});
}
}
void _cleanRelayoutSubtreeRootChildren() { } // workaround for lack of inter-class mixins in Dart
void scheduleInitialLayout() {
assert(attached);
assert(parent == null);
@ -541,9 +546,9 @@ abstract class RenderObjectWithChildMixin<ChildType extends RenderObject> implem
if (_child != null)
_child.detach();
}
void _cleanRelayoutSubtreeRootChildren() {
void visitChildren(RenderObjectVisitor visitor) {
if (_child != null)
_child._cleanRelayoutSubtreeRoot();
visitor(_child);
}
String debugDescribeChildren(String prefix) {
if (child != null)
@ -734,10 +739,10 @@ abstract class ContainerRenderObjectMixin<ChildType extends RenderObject, Parent
child = child.parentData.nextSibling;
}
}
void _cleanRelayoutSubtreeRootChildren() {
void visitChildren(RenderObjectVisitor visitor) {
ChildType child = _firstChild;
while (child != null) {
child._cleanRelayoutSubtreeRoot();
visitor(child);
assert(child.parentData is ParentDataType);
child = child.parentData.nextSibling;
}

View File

@ -70,6 +70,14 @@ class RenderScaffold extends RenderBox {
}
}
void visitChildren(RenderObjectVisitor visitor) {
for (ScaffoldSlots slot in ScaffoldSlots.values) {
RenderBox box = _slots[slot];
if (box != null)
visitor(box);
}
}
ScaffoldSlots remove(RenderBox child) {
assert(child != null);
for (ScaffoldSlots slot in ScaffoldSlots.values) {