hydrate method

Future<BloomMountHandle?> hydrate()

Triggers immediate hydration of this island instance.

Guaranteed to execute hydration at most once. If already hydrated, failed, or disposed, returns the existing mountHandle (or null).

await islandInstance.hydrate();

Implementation

Future<BloomMountHandle?> hydrate() async {
  if (_status != IslandStatus.pending || _isHydrating) {
    return _mountHandle;
  }
  _isHydrating = true;
  _runCleanups();

  try {
    final definition = _orchestrator.registry.get(name);
    if (definition == null) {
      throw StateError(
        'Bloom island: no builder registered for island "$name".',
      );
    }

    final node = definition.builder(props);
    final handle = hydrateElement(node, element);
    _mountHandle = handle;
    _status = IslandStatus.hydrated;
    _isHydrating = false;

    try {
      element.setAttribute(bloomHydratedAttribute, 'true');
    } catch (_) {}

    BloomJsDevTools.notify('island-hydrated', {
      'name': name,
      'strategy': strategy.value,
    });

    return handle;
  } catch (err, stack) {
    _status = IslandStatus.failed;
    _error = err;
    _stackTrace = stack;
    _isHydrating = false;

    BloomJsDevTools.notify('mount-error', {
      'error': err.toString(),
      'stackTrace': stack.toString(),
      'island': name,
    });

    if (bloomDevErrorOverlayEnabled) {
      element.textContent = '';
      final overlayHost = web.document.createElement('div');
      overlayHost.innerHTML = renderDevErrorOverlay(
        err,
        stack,
        componentName: 'Island: $name',
      ).toJS;
      element.appendChild(overlayHost);
    }

    return null;
  }
}