getOrNull<N extends Node> method

N? getOrNull<N extends Node>({
  1. Key? key,
})

Looks up a node by type compatibility (supports interfaces).

Implementation

N? getOrNull<N extends Node>({Key? key}) {
  if (key != null) {
    // Direct runtimeKey match if key is already fully resolved runtimeKey
    final direct = getByKey(key);
    if (direct is N) return direct;

    // Exact type + key match
    final runtimeKey = Node.buildRuntimeKey(N, key);
    final exact = _nodes[runtimeKey];
    if (exact is N) return exact;

    // Subtype match (e.g. find Node implementing interface N with same key)
    final keyValue = key is ValueKey ? key.value : key;
    for (final node in _nodes.values) {
      if (node is N) {
        if (node.key == key ||
            (node.key != null && node.key!.value == keyValue)) {
          return node;
        }
      }
    }
    return null;
  }
  // Exact match first
  final exact = _nodes[Node.buildRuntimeKey(N)];
  if (exact is N) return exact;
  // Subtype match (e.g. find ProductsNode via CatalogueControllerInterface)
  for (final node in _nodes.values) {
    if (node is N && node.key == null) return node;
  }
  for (final node in _nodes.values) {
    if (node is N) return node;
  }
  return null;
}