registerLayer static method

void registerLayer({
  1. required String id,
  2. required int activationOrder,
  3. required int stackLevel,
  4. required InterleavedLayerBuilder builder,
  5. 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)}',
  );
}