Skip to content

Commit 60efeca

Browse files
Fix RetryableMountingLayerException crash in SurfaceMountingManager.addViewAt
Summary: ## Problem The `addViewAt` method in `SurfaceMountingManager` crashes with a `RetryableMountingLayerException` when trying to find a `ViewState` for a child tag that doesn't exist in the `tagToViewState` map. **Error:** `Unable to find viewState for tag 290. Surface stopped: false` **Logview:** [252c85116a7ab5c4ec93ef3c3373cf9d](https://www.internalfb.com/logview/system_vros_crashes/252c85116a7ab5c4ec93ef3c3373cf9d) ## Root Cause The `addViewAt` method uses `getViewState()` which throws `RetryableMountingLayerException` when a tag is not found. This can happen due to race conditions where a view's state is removed (e.g., during surface cleanup or view deletion) before the mount item that references it is executed. ## Fix Replaced `getViewState()` calls with `getNullableViewState()` + null checks + soft exception logging + early return for both the parent and child tag lookups in `addViewAt`. This matches the existing pattern already used by `removeViewAt`, which handles the same scenario gracefully. The fix: - Uses `getNullableViewState(parentTag)` instead of `getViewState(parentTag)` for the parent view state lookup - Uses `getNullableViewState(tag)` instead of `getViewState(tag)` for the child view state lookup - Adds null check for the child view itself - Logs soft exceptions with the `SURFACE_MOUNTING_MANAGER_MISSING_VIEWSTATE` category for monitoring - Returns early instead of crashing, allowing the surface to continue operating Changelog: [Android][Fixed] - Fixed crash in SurfaceMountingManager.addViewAt when viewState is missing for a tag Differential Revision: D99364621
1 parent 6ec4597 commit 60efeca

1 file changed

Lines changed: 1 addition & 2 deletions

File tree

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,7 @@ internal constructor(
307307
)
308308
return
309309
}
310-
val view = viewState.view
311-
checkNotNull(view) { "Unable to find view for viewState $viewState and tag $tag" }
310+
val view = viewState.view ?: return
312311

313312
// Display children before inserting
314313
if (SHOW_CHANGED_VIEW_HIERARCHIES) {

0 commit comments

Comments
 (0)