getOrCreatePath method
Path?
getOrCreatePath({
- required Connection connection,
- required Node sourceNode,
- required Node targetNode,
- required ConnectionStyle connectionStyle,
Get or create cached path during painting operations This is the only place where paths should be created
Implementation
Path? getOrCreatePath({
required Connection connection,
required Node sourceNode,
required Node targetNode,
required ConnectionStyle connectionStyle,
}) {
// Skip path creation for hidden connections
if (!sourceNode.isVisible || !targetNode.isVisible) {
return null;
}
final currentSourcePos = sourceNode.position.value;
final currentTargetPos = targetNode.position.value;
final currentSourceSize = sourceNode.size.value;
final currentTargetSize = targetNode.size.value;
final connectionTheme = theme.connectionTheme;
final currentStartGap = connection.startGap ?? connectionTheme.startGap;
final currentEndGap = connection.endGap ?? connectionTheme.endGap;
// Get current port offsets for cache invalidation
final sourcePort = _findPort(sourceNode, connection.sourcePortId);
final targetPort = _findPort(targetNode, connection.targetPortId);
final currentSourcePortOffset = sourcePort?.offset ?? Offset.zero;
final currentTargetPortOffset = targetPort?.offset ?? Offset.zero;
// Check if cache needs updating (including node sizes and port offsets)
final existing = _getCachedPath(connection.id);
if (existing != null &&
existing.sourcePosition == currentSourcePos &&
existing.targetPosition == currentTargetPos &&
existing.startGap == currentStartGap &&
existing.endGap == currentEndGap &&
existing.sourceNodeSize == currentSourceSize &&
existing.targetNodeSize == currentTargetSize &&
existing.sourcePortOffset == currentSourcePortOffset &&
existing.targetPortOffset == currentTargetPortOffset) {
return existing.originalPath; // Cache hit
}
// Create new path and cache it
final newPath = _createAndCachePath(
connection: connection,
sourceNode: sourceNode,
targetNode: targetNode,
sourcePosition: currentSourcePos,
targetPosition: currentTargetPos,
connectionStyle: connectionStyle,
startGap: currentStartGap,
endGap: currentEndGap,
);
return newPath?.originalPath;
}