From 4c5c8c16fc98c8d56a46331e1644a05e3aef70c1 Mon Sep 17 00:00:00 2001 From: Jacques Leupin Date: Thu, 11 Jun 2026 16:27:27 -0700 Subject: [PATCH] fix(Android): guard against re-adding an attached fragment in ScreenStack.onUpdate Co-authored-by: Cursor --- .../src/main/java/com/swmansion/rnscreens/ScreenStack.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt index bffd9c7c72..3c553df6f2 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt @@ -269,6 +269,12 @@ class ScreenStack( screenWrappers .asSequence() .dropWhile { it !== visibleBottom } // ignore all screens beneath the visible bottom + // Skip fragments that are still attached, otherwise the transaction throws + // "Fragment already added" - e.g. when visibleBottom's fragment got detached + // while fragments above it stayed attached. Dismissed wrappers are exempt: + // their removal is queued earlier in this transaction, so adding them back + // is the legal remove + add re-attach path. + .filter { !it.fragment.isAdded || dismissedWrappers.contains(it) } .forEach { wrapper -> // TODO: It should be enough to dispatch this on commit action once. transaction.add(id, wrapper.fragment).runOnCommit {