Description
When headerTransparent: true option is passed alongside presentation: 'formSheet', this triggers a NullPointerException below on Android, causing a crash.
This is easy to reproduce in a blank project and happens 100% of the time.
java.lang.NullPointerException
at com.swmansion.rnscreens.ScreenStackFragment.handleInsetsUpdateAndNotifyTransition(ScreenStackFragment.kt:520)
at com.swmansion.rnscreens.ScreenStackFragment.attachInsetsAndLayoutListenersToBottomSheet$lambda$14$lambda$12(ScreenStackFragment.kt:490)
at com.swmansion.rnscreens.ScreenStackFragment.$r8$lambda$08bdqqabsW79KNiJDXqJqr0o49Q(Unknown Source:0)
at com.swmansion.rnscreens.ScreenStackFragment$$ExternalSyntheticLambda1.onApplyWindowInsets(D8$$SyntheticClass:0)
at android.view.View.dispatchApplyWindowInsets(View.java:12597)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7472)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7497)
at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7479)
at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:3307)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3560)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2917)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10324)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1406)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1415)
at android.view.Choreographer.doCallbacks(Choreographer.java:1015)
at android.view.Choreographer.doFrame(Choreographer.java:945)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1389)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8705)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
Steps to reproduce
import { Button, Text } from 'react-native';
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
const HomeScreen = ({ navigation }) => (
<SafeAreaView>
<Button
title="Open form sheet"
onPress={() => navigation.navigate('Sheet')}
/>
</SafeAreaView>
);
const SheetScreen = () => (
<SafeAreaView>
<Text>This is a form sheet.</Text>
</SafeAreaView>
);
const App = () => (
<SafeAreaProvider>
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen
name="Sheet"
component={SheetScreen}
options={{
presentation: 'formSheet',
sheetAllowedDetents: 'fitToContents',
headerTransparent: true, // <-- this line causes a crash
}}
/>
</Stack.Navigator>
</NavigationContainer>
</SafeAreaProvider>
);
export default App;
{
"name": "RnScreensRepro",
"version": "0.0.1",
"private": true,
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
"lint": "eslint .",
"start": "react-native start",
"test": "jest"
},
"dependencies": {
"@react-native/new-app-screen": "0.85.2",
"@react-navigation/native": "7.2.2",
"@react-navigation/native-stack": "7.14.11",
"react": "19.2.3",
"react-native": "0.85.2",
"react-native-safe-area-context": "5.7.0",
"react-native-screens": "4.24.0"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"@babel/runtime": "^7.25.0",
"@react-native-community/cli": "20.1.0",
"@react-native-community/cli-platform-android": "20.1.0",
"@react-native-community/cli-platform-ios": "20.1.0",
"@react-native/babel-preset": "0.85.2",
"@react-native/eslint-config": "0.85.2",
"@react-native/jest-preset": "0.85.2",
"@react-native/metro-config": "0.85.2",
"@react-native/typescript-config": "0.85.2",
"@types/jest": "^29.5.13",
"@types/react": "^19.2.0",
"@types/react-test-renderer": "^19.1.0",
"eslint": "^8.19.0",
"jest": "^29.6.3",
"prettier": "2.8.8",
"react-test-renderer": "19.2.3",
"typescript": "^5.8.3"
},
"engines": {
"node": ">=22.11.0"
}
}
Snack or a link to a repository
https://github.com/SimpleCreations/SEE_REPRO_ABOVE_sorry_bot
Screens version
4.24.0
React Native version
0.85.2
Platforms
Android
JavaScript runtime
Hermes
Workflow
React Native (without Expo)
Architecture
Fabric (New Architecture)
Build type
Debug mode
Device
Android emulator
Device model
No response
Acknowledgements
Yes
Description
When
headerTransparent: trueoption is passed alongsidepresentation: 'formSheet', this triggers aNullPointerExceptionbelow on Android, causing a crash.This is easy to reproduce in a blank project and happens 100% of the time.
Steps to reproduce
Snack or a link to a repository
https://github.com/SimpleCreations/SEE_REPRO_ABOVE_sorry_bot
Screens version
4.24.0
React Native version
0.85.2
Platforms
Android
JavaScript runtime
Hermes
Workflow
React Native (without Expo)
Architecture
Fabric (New Architecture)
Build type
Debug mode
Device
Android emulator
Device model
No response
Acknowledgements
Yes