hydrate method
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;
}
}