replaceAllChildren method

  1. @override
void replaceAllChildren(
  1. List<RenderObject> newChildren
)
override

Replaces the entire children list with newChildren in the given order. Implementations must adopt children that are new and drop children that are no longer present.

Implementation

@override
void replaceAllChildren(List<RenderObject> newChildren) {
  if (hasSameRenderChildrenInOrder(_children, newChildren)) return;
  final removedIndex = singleRemovedRenderChildIndex(_children, newChildren);
  if (removedIndex != null) {
    final removed = _children[removedIndex];
    dropChild(removed);
    _childOffsets.remove(removed);
    _children.removeAt(removedIndex);
    markNeedsLayout();
    return;
  }

  final newSet = Set<RenderObject>.identity()..addAll(newChildren);
  for (final c in List<RenderObject>.from(_children)) {
    if (!newSet.contains(c)) {
      dropChild(c);
      _childOffsets.remove(c);
    }
  }
  final oldSet = Set<RenderObject>.identity()..addAll(_children);
  for (final c in newChildren) {
    if (!oldSet.contains(c)) {
      adoptChild(c);
    }
  }
  _children
    ..clear()
    ..addAll(newChildren);
  markNeedsLayout();
}