getOrNull<N extends Node> method
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;
}