react-native-gesture-handler: Could not find root view for a given ancestor with tag
Description
We are seeing the following crash on Android:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Could find root view for a given ancestor with tag 3199
at com.swmansion.gesturehandler.react.RNGestureHandlerModule.tryInitializeHandlerForReactRootView(RNGestureHandlerModule.java:18)
at com.swmansion.gesturehandler.react.RNGestureHandlerModule.attachGestureHandler(RNGestureHandlerModule.java:1)
at java.lang.reflect.Method.invoke(Method.java)
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:18)
at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:2)
at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
at android.os.Handler.handleCallback(Handler.java:869)
at android.os.Handler.dispatchMessage(Handler.java:101)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:1)
at android.os.Looper.loop(Looper.java:206)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:8)
at java.lang.Thread.run(Thread.java:764)
Screenshots
Steps To Reproduce
I was not able to reproduce it consistently, but it seems to happen after the app goes to foreground.
Package versions
- React: 17.0.1
- React Native: >= 0.64.2
- React Native Gesture Handler: 1.10.3
- React Navigation: 5.14.4
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Reactions: 21
- Comments: 51
+1
I was able to resolve this issue in my project. The problem is that
Codepush.restartApp
doesn’t actually restart the app. Instead, it uses the ReactNativeInstanceManager class to reload the bundle:https://github.com/facebook/react-native/blob/4fb49cd555942caba1515b6a03f8ccea931dfc90/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java#L435
This means that if any RN-GestureHandler components begin initializing before a
Codepush.restartApp
, there is a very good chance that when they finish., the RootNode doesn’t exist anymore. This is what causes the crash.To solve this, you have to make sure there are no instances of RN-GestureHandler in the process of loading before a
Codepush.restartApp
operation. This includes things likereact-navigation
, which will mount gesture handlers behind the scenes.In our case, when our app loads we begin a codepush sync. While the codepush is in any of these states, we render a simple View with no gesture handlers or react-navigation are mounted:
CHECKING_FOR_UPDATE
,DOWNLOADING_PACKAGE
,UPDATE_INSTALLED
,INSTALLING_UPDATE
.Only after the codepush is completely finished, it’s safe to mount any react-navigation components.
The error doesn’t say “Could not find” but “Could find”.
Does anyone have steps that we can follow to consistently reproduce this bug? (ideally in an emulator)
This may not really be a fix, but we found a workaround for this that is working well for us. We are using:
RNGestureHandlerModule.java
:… and just return instead of throwing. Honestly we’re not exactly sure of the ramifications of this, but the app seems to behave normally in this scenario.
So far we have not discovered any other issues to our workaround but it’s still something we want to revisit.
Also maybe worth noting… that while we don’t use codepush, we do use react-native-restart which might do something similar to codepush.
Our team is also using Codepush. Crashes with this stack trace is pretty common after a codepush restart on Android. We have our app wrapped in
GestureHandlerRootView
, but maybe something about the codepush restart causes this to become unmounted? I’m planning on looking more into it this week.+1
hi @LFMAKER @brduck are you guys find a way to solve this on expo?
we found a way to test this out. In our case, our codePush installMode uses the
ON_NEXT_RESUME
strategy, so after downloading the codePush update it is installed when user comes back to the foreground.background
toactive
.Hope this helps
We have a lot of these crashes but we do not use codepush so while it seems to be triggered by a codepush restart it can also happen in apps that do not use codepush at all.
I have the same problem with code push in production. What I don’t understand is that it is not systematic and in staging we are not able to reproduce it.
No, not using codepush.
I updated my comment, you might also try adding flex styles to the component. Eg:
+1