Skip to content

Fabric updateProps Never Called — BlurView Always Using Legacy Manager (iOS) #658

@akshay-engage

Description

@akshay-engage

Here is the final, GitHub-ready issue, including your React Native version and Podfile configuration, formatted cleanly with bold, code, and proper headings.


Issue: Fabric updateProps Never Called — BlurView Always Uses Legacy Manager (iOS, RN 0.82.1)

Hi team,

I am integrating your BlurView component in an app running React Native 0.82.1, with New Architecture + Fabric + Bridgeless fully enabled.

However, based on extensive logging, it appears that the iOS implementation of BlurView never uses the Fabric component, and instead always routes through the legacy (Paper) interoperability layer.

I am sharing detailed evidence below so you can confirm whether this is expected or if something in the library needs an update.


Environment

  • React Native: 0.82.1
  • iOS
  • New Architecture: Enabled
  • Fabric: Enabled
  • Bridgeless: Enabled
  • Hermes: Enabled

Podfile Configuration

# Enable New Architecture
ENV['RCT_NEW_ARCH_ENABLED'] = '1'
# Enable bridgeless mode
ENV['RCT_BRIDGELESS_ENABLED'] = '1'

use_react_native!(
  :path => config[:reactNativePath],
  :app_path => "#{Pod::Config.instance.installation_root}/..",
  :hermes_enabled => true,        # Hermes is recommended
  :fabric_enabled => true,        # Enable Fabric renderer
  :new_arch_enabled => true       # Enable TurboModules + Fabric
)

New Architecture is clearly enabled. Fabric is clearly enabled.
Yet the BlurView does not behave like a Fabric component.


Expected Behavior

Under Fabric:

  • The Fabric component (BlurView.mm) should be initialized
  • updateProps should be triggered whenever props (like blurAmount) change
  • Fabric lifecycle methods (initWithFrame, componentDescriptorProvider, etc.) should fire

Actual Behavior

  • updateProps is NEVER called
  • No logs from Fabric descriptors or Fabric lifecycle
  • All logs come from the legacy BlurViewManager
  • Prop updates only call legacy setters like setBlurAmount
  • Component behaves entirely like a Paper-interop view

This strongly suggests Fabric is not being used at all for this component.


Logs — Initialization Phase

These are the logs printed when the BlurView mounts:

WEG: BlurViewManager.m: view: void
WEG: BlurView.mm: init: void
WEG: BlurView.mm: initWithFrame: {{0, 0}, {0, 0}}
WEG: BlurView.mm: setBlurAmount: 10
WEG: BlurView.mm: updateBlurEffect: void
WEG: BlurView.mm: blurEffectStyle: void
WEG: BlurView.mm: setBlurType: dark
WEG: BlurView.mm: updateBlurEffect: void
WEG: BlurView.mm: blurEffectStyle: void
WEG: BlurView.mm: updateBlurEffect: void
WEG: BlurView.mm: blurEffectStyle: void
WEG: BlurView.mm: updateFallbackView: void
WEG: BlurView.mm: useReduceTransparencyFallback: void
WEG: BlurView.mm: setBlurAmount: 11
WEG: BlurView.mm: updateBlurEffect: void
WEG: BlurView.mm: blurEffectStyle: void
WEG: BlurView.mm: setBlurType: light
WEG: BlurView.mm: updateBlurEffect: void
WEG: BlurView.mm: blurEffectStyle: void
WEG: BlurView.mm: setReducedTransparencyFallbackColor: UIExtendedSRGBColorSpace 1 1 1 1
WEG: BlurView.mm: updateFallbackView: void
WEG: BlurView.mm: useReduceTransparencyFallback: void
WEG: BlurView.mm: layoutSubviews: void

Even though some methods from BlurView.mm appear here,
none of the Fabric-only lifecycle methods are triggered.


Logs — When Props Update

WEG: BlurView.mm: setBlurAmount: 1
WEG: BlurView.mm: updateBlurEffect: void
WEG: BlurView.mm: blurEffectStyle: void
WEG: BlurView.mm: layoutSubviews: void

Still no updateProps call.


Fabric updateProps Implementation (Never Invoked)

- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
{
  NSLog(@"WEG: BlurView.mm: updateProps: newProps + oldProps");

  const auto &oldViewProps = *std::static_pointer_cast<const BlurViewProps>(_props);
  const auto &newViewProps = *std::static_pointer_cast<const BlurViewProps>(props);
  
  if (oldViewProps.blurAmount != newViewProps.blurAmount) {
    NSNumber *blurAmount = [NSNumber numberWithInt:newViewProps.blurAmount];
    [self setBlurAmount:blurAmount];
  }

  if (oldViewProps.blurType != newViewProps.blurType) {
    NSString *blurType = [NSString stringWithUTF8String:toString(newViewProps.blurType).c_str()];
    [self setBlurType:blurType];
  }
  
  if (oldViewProps.reducedTransparencyFallbackColor != newViewProps.reducedTransparencyFallbackColor) {
    UIColor *color = RCTUIColorFromSharedColor(newViewProps.reducedTransparencyFallbackColor);
    [self setReducedTransparencyFallbackColor:color];
  }
  
  [super updateProps:props oldProps:oldProps];
}

This log never prints — meaning Fabric props pipeline is not active.


My Current Understanding (Please Confirm)

It appears that:

  • The BlurView component is not registered or handled as a Fabric component on iOS
  • React Native therefore falls back to the legacy interoperability layer
  • Fabric's prop system is never engaged
  • The component does not behave like a true Fabric view, despite RN 0.82.1 and all Fabric flags enabled

If my interpretation is incorrect, I would appreciate a detailed explanation of:

  • Why Fabric paths are being bypassed
  • Whether something in the library’s iOS implementation needs updating
  • Whether this library currently supports full Fabric on iOS

I can also provide a minimal reproducible repo if needed.

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions