updateChild method

  1. @override
Element? updateChild(
  1. Element? child,
  2. Widget? newWidget,
  3. Object? newSlot
)
override

Update the given child with the given new configuration.

This method is the core of the widgets system. It is called each time we are to add, update, or remove a child based on an updated configuration.

The newSlot argument specifies the new value for this element's slot.

If the child is null, and the newWidget is not null, then we have a new child for which we need to create an Element, configured with newWidget.

If the newWidget is null, and the child is not null, then we need to remove it because it no longer has a configuration.

If neither are null, then we need to update the child's configuration to be the new configuration given by newWidget. If newWidget can be given to the existing child (as determined by Widget.canUpdate), then it is so given. Otherwise, the old child needs to be disposed and a new child created for the new configuration.

If both are null, then we don't have a child and won't have a child, so we do nothing.

The updateChild method returns the new child, if it had to create one, or the child that was passed in, if it just had to update the child, or null, if it removed the child and did not replace it.

The following table summarizes the above:

newWidget == null newWidget != null
child == null Returns null. Returns new Element.
child != null Old child is removed, returns null. Old child updated if possible, returns child or new Element.

The newSlot argument is used only if newWidget is not null. If child is null (or if the old child cannot be updated), then the newSlot is given to the new Element that is created for the child, via inflateWidget. If child is not null (and the old child can be updated), then the newSlot is given to updateSlotForChild to update its slot, in case it has moved around since it was last built.

See the RenderObjectElement documentation for more information on slots.

Implementation

@override
Element? updateChild(Element? child, Widget? newWidget, Object? newSlot) {
  final SliverMultiBoxAdaptorParentData? oldParentData = child?.renderObject?.parentData as SliverMultiBoxAdaptorParentData?;
  final Element? newChild = super.updateChild(child, newWidget, newSlot);
  final SliverMultiBoxAdaptorParentData? newParentData = newChild?.renderObject?.parentData as SliverMultiBoxAdaptorParentData?;

  // Preserve the old layoutOffset if the renderObject was swapped out.
  if (oldParentData != newParentData && oldParentData != null && newParentData != null) {
    newParentData.layoutOffset = oldParentData.layoutOffset;
  }
  return newChild;
}