Skip to content

Commit c847804

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 795d902 commit c847804

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,15 @@ internal constructor(
308308
return
309309
}
310310
val view = viewState.view
311-
checkNotNull(view) { "Unable to find view for viewState $viewState and tag $tag" }
311+
if (view == null) {
312+
ReactSoftExceptionLogger.logSoftException(
313+
ReactSoftExceptionLogger.Categories.SURFACE_MOUNTING_MANAGER_MISSING_VIEWSTATE,
314+
IllegalStateException(
315+
"Unable to find view for viewState $viewState and tag $tag for addViewAt"
316+
),
317+
)
318+
return
319+
}
312320

313321
// Display children before inserting
314322
if (SHOW_CHANGED_VIEW_HIERARCHIES) {

0 commit comments

Comments
 (0)