patch function
Implementation
void patch(Node dom, Morphic prev, Morphic next) {
assert(
_isResolved(prev),
'prev tree contains unresolved Components. Call resolveNode() first.',
);
assert(
_isResolved(next),
'next tree contains unresolved Components. Call resolveNode() first.',
);
if (prev.runtimeType != next.runtimeType) {
_replaceAll(dom, prev, next);
return;
}
if (prev is TextMorphic && next is TextMorphic) {
if (prev.value != next.value) {
(dom as Text).data = next.value;
}
return;
}
if (prev is ElementMorphic && next is ElementMorphic) {
if (prev.tag != next.tag) {
_replace(dom, createDom(next));
return;
}
final el = dom as Element;
_patchAttributes(el, prev, next);
final prevChildren = prev.children.cast<Morphic>();
final nextChildren = next.children.cast<Morphic>();
_patchChildren(el, prevChildren, nextChildren);
return;
}
// Fragment → fragment: patch each child in-place via the parent element.
// The fragment itself has no DOM node — we need its parent to operate on.
if (prev is FragmentMorphic && next is FragmentMorphic) {
// Fragment-level patch is handled entirely by _patchChildren of the
// parent element — fragments expand into their children inline.
// This branch is only reached if patch() is called directly on a
// fragment, which should not happen in normal operation.
return;
}
}