attachFutureElement method

void attachFutureElement(
  1. DOMElement? domParent,
  2. T? parent,
  3. DOMNode domElement,
  4. T? templateElement,
  5. Object? futureElementResolved,
  6. DOMTreeMap<T> treeMap,
  7. DOMContext<T>? context,
)

Implementation

void attachFutureElement(
  DOMElement? domParent,
  T? parent,
  DOMNode domElement,
  T? templateElement,
  Object? futureElementResolved,
  DOMTreeMap<T> treeMap,
  DOMContext<T>? context,
) {
  futureElementResolved = resolveElements(
    futureElementResolved,
    treeMap: treeMap,
    context: context,
    setTreeMapRoot: false,
  );
  if (futureElementResolved == null) return;

  if (futureElementResolved is List<Object?>) {
    var futureElementResolvedListTyped = futureElementResolved
        .expand((e) => e.expandNonNullable())
        .whereType<T>()
        .toList();

    if (futureElementResolvedListTyped.isEmpty) return;

    if (futureElementResolvedListTyped.length == 1) {
      var futureElementResolved = futureElementResolvedListTyped.first;
      treeMap.map(
        domElement,
        futureElementResolved,
        generator: this,
        context: context,
        allowOverwrite: true,
      );
      if (parent != null) {
        replaceChildElement(parent, templateElement, [futureElementResolved]);
      }
    } else {
      var wrap = wrapElements(futureElementResolvedListTyped);
      if (wrap != null) {
        treeMap.map(
          domElement,
          wrap,
          generator: this,
          context: context,
          allowOverwrite: true,
        );
      }

      if (parent != null) {
        replaceChildElement(
          parent,
          templateElement,
          futureElementResolvedListTyped,
        );
      }
    }
  } else if (futureElementResolved is T) {
    treeMap.map(
      domElement,
      futureElementResolved,
      generator: this,
      context: context,
      allowOverwrite: true,
    );
    if (parent != null) {
      replaceChildElement(parent, templateElement, [futureElementResolved]);
    }
  } else if (parent != null) {
    var children = addExternalElementToElement(
      parent,
      futureElementResolved,
      treeMap: treeMap,
      context: context,
    );

    if (children == null || children.isEmpty) {
      removeChildFromElement(parent, templateElement);
    } else {
      var node = children.first;
      treeMap.map(domElement, node, generator: this, context: context);

      for (var child in children) {
        removeChildFromElement(parent, child);
      }
      replaceChildElement(parent, templateElement, children);
    }
  }
}