onWidgetDispose static method

void onWidgetDispose(
  1. String scopeName,
  2. bool autoDispose
)

Called when widget disposes - handles complete disposal logic

Implementation

static void onWidgetDispose(String scopeName, bool autoDispose) {
  if (ZenConfig.enableDebugLogs) {
    ZenLogger.logDebug(
        '📤 Widget disposing: $scopeName (autoDispose: $autoDispose)');
  }

  if (autoDispose) {
    // Dispose auto-dispose scope completely
    final scope = _autoDisposeScopes.remove(scopeName);
    if (scope != null && !scope.isDisposed) {
      try {
        scope.dispose();
        if (ZenConfig.enableDebugLogs) {
          ZenLogger.logDebug('🗑️ Disposed auto-dispose scope: $scopeName');
        }
      } catch (e, stackTrace) {
        ZenLogger.logError(
            'Error disposing auto-dispose scope $scopeName', e, stackTrace);
      }
    }

    // Clean up all tracking for auto-dispose scope
    _removeScopeFromTracking(scopeName);
  } else {
    // Handle persistent scope widget disposal
    if (!_explicitlyPersistentScopes.contains(scopeName)) {
      final children = _getRemainingChildren(scopeName);
      if (children.isEmpty) {
        _disposeDirectly(scopeName);
      } else {
        if (ZenConfig.enableDebugLogs) {
          ZenLogger.logDebug(
              '⏳ Keeping scope $scopeName alive (has children: ${children.join(', ')})');
        }
      }
    } else {
      if (ZenConfig.enableDebugLogs) {
        ZenLogger.logDebug(
            '🔒 Persistent scope widget disposed but scope remains: $scopeName');
      }
    }
  }
}