React Native 0.86 (Expo SDK 57) enables edge-to-edge Android by default - your app draws behind the status and navigation bars, matching Android 15 guidance. This cookbook covers the RN defaults, expo-status-bar, expo-navigation-bar, and the inset patterns that keep buttons tappable.
RN 0.86 opts into edge-to-edge at the native activity/window level - the window extends under system bars.
Insets from react-native-safe-area-context report how much of the screen is obscured by status bar, display cutout, and navigation bar (gesture or 3-button).
expo-status-bar sets icon/text color (light | dark | auto) - it does not replace inset padding.
expo-navigation-bar controls Android navigation bar background, button style, visibility, and position (relative vs absolute).
Keyboard avoidance is separate - KeyboardAvoidingView / react-native-keyboard-controller still apply; bottom inset and keyboard may stack.
Inspect android/app/src/main/res/values/styles.xml after prebuild - windowLayoutInDisplayCutoutMode and transparent status/nav bar colors should be present in the RN 0.86 template.
Padding SafeAreaView and manual insets.top together - doubles top gap. Fix: One owner per axis.
White status icons on white header - StatusBar style="light" on light background. Fix: Match style to background luminance per screen.
Tab bar overlaps home indicator - React Navigation tabs may need safeAreaInsets tuning. Fix: Pass tabBarStyle: { height: 56 + insets.bottom } or use library defaults on SDK 57.
Testing only on 3-button nav - Gesture nav changes bottom inset height. Fix: Toggle Settings → System navigation on emulator.
Opaque nav bar color fighting transparency - Some OEM skins ignore alpha. Fix:setPositionAsync("absolute") + reapply on focus.
Assuming expo-status-bar adds padding - It only styles icons. Fix: Always pair with react-native-safe-area-context.