From 1ac742610bc8e3995abea54b562e3406a6d39ba4 Mon Sep 17 00:00:00 2001 From: Krzysztof Magiera Date: Tue, 14 Jan 2020 18:28:19 +0100 Subject: [PATCH] Fix detaching views rendered under header config component. (#282) This change fixes the problem when header update would get triggered while the header config subviews are not yet fully unmounted. The root cause of this problem is kind of a mystery, I encouneter a crash when going back using back button from a screen that have custom back button image rendered. Turned out that after implementing removeAll schema the problem no longer occurs. I didn't have enough time to investigate it further but supporting removeAll schema is an improvement regardless so going with this solution for now. --- .../java/com/swmansion/rnscreens/ScreenContainer.java | 8 ++++++++ .../swmansion/rnscreens/ScreenContainerViewManager.java | 5 +++++ .../main/java/com/swmansion/rnscreens/ScreenStack.java | 6 ++++++ .../com/swmansion/rnscreens/ScreenStackHeaderConfig.java | 5 +++++ .../rnscreens/ScreenStackHeaderConfigViewManager.java | 5 +++++ 5 files changed, 29 insertions(+) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java b/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java index 299ff52d..e51e8116 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java @@ -105,6 +105,14 @@ public class ScreenContainer extends ViewGroup { markUpdated(); } + protected void removeAllScreens() { + for (int i = 0, size = mScreenFragments.size(); i < size; i++) { + mScreenFragments.get(i).getScreen().setContainer(null); + } + mScreenFragments.clear(); + markUpdated(); + } + @Override public void startViewTransition(View view) { super.startViewTransition(view); diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.java b/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.java index fddbb13b..695899de 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.java @@ -34,6 +34,11 @@ public class ScreenContainerViewManager extends ViewGroupManager { super.removeScreenAt(index); } + @Override + protected void removeAllScreens() { + mDismissed.clear(); + super.removeAllScreens(); + } + @Override protected boolean hasScreen(ScreenFragment screenFragment) { return super.hasScreen(screenFragment) && !mDismissed.contains(screenFragment); diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java index 90ef863f..93121d01 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java @@ -243,6 +243,11 @@ public class ScreenStackHeaderConfig extends ViewGroup { maybeUpdate(); } + public void removeAllConfigSubviews() { + mConfigSubviews.clear(); + maybeUpdate(); + } + public void addConfigSubview(ScreenStackHeaderSubview child, int index) { mConfigSubviews.add(index, child); maybeUpdate(); diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java index 7d1f7a56..0e271470 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java @@ -32,6 +32,11 @@ public class ScreenStackHeaderConfigViewManager extends ViewGroupManager