registerLayer static method
void
registerLayer({
- required String id,
- required int activationOrder,
- required int stackLevel,
- required InterleavedLayerBuilder builder,
- BuildContext? context,
Register or update a layer in the global interleaved host.
Implementation
static void registerLayer({
required String id,
required int activationOrder,
required int stackLevel,
required InterleavedLayerBuilder builder,
BuildContext? context,
}) {
if (!enabled) return;
final existingIndex = _layers.value.indexWhere((layer) => layer.id == id);
final next = List<InterleavedOverlayLayer>.from(_layers.value);
final candidate = InterleavedOverlayLayer(
id: id,
activationOrder: activationOrder,
stackLevel: stackLevel,
builder: builder,
);
if (existingIndex == -1) {
// First time registration.
next.add(candidate);
} else {
final current = next[existingIndex];
final unchanged = current.activationOrder == activationOrder &&
current.stackLevel == stackLevel;
if (unchanged) {
// Keep host installed and visible even if data didn't change.
ensureInstalled(context: context);
return;
}
// Update the layer in place for the same id.
next[existingIndex] = candidate;
}
// Sort and publish the updated layer list.
_sortLayers(next);
_layers.value = next;
_entry?.markNeedsBuild();
ensureInstalled(context: context);
// Avoid forcing a remove+insert cycle when the host is already mounted;
// that remounts layer subtrees and can replay entry animations (for
// example active snackbars). Newly-installed hosts are inserted at top.
if (_entry == null || !_entry!.mounted) {
requestBringToFront(context: context);
}
// Order is sorted by activationOrder (first) then stackLevel (second).
// activationOrder preserves "first shown" semantics across systems.
_debugInterleaveLog(
'registerLayer id=$id order=${_formatLayerOrder(_layers.value)}',
);
}