Skip to content

NullPointerException crash when headerTransparent: true option is set on a Form Sheet #3910

@SimpleCreations

Description

@SimpleCreations

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

Metadata

Metadata

Assignees

Labels

platform:androidIssue related to Android part of the libraryrepro-providedA reproduction with a snack or repo is provided

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions