In a real app
A correct install has @react-navigation/native, one or more navigators, and the two dependencies nearly all of them require: react-native-screens and react-native-safe-area-context. On Expo, npx expo install picks the versions compatible with the SDK. On Android, the docs call for a MainActivity change to avoid crashes when view state is not persisted across Activity recreation.
The choice of stack navigator matters. @react-navigation/native-stack gives you the system’s transitions, back gesture, and header; @react-navigation/stack is JavaScript, more customizable, heavier, depends on Gesture Handler, and animates with the Animated API. A project mixing both for historical reasons pays twice. Another frequent pitfall: screens remounting because component receives an inline arrow function or because the navigator is recreated on every parent render.
Deep linking is configured in linking (prefixes, config) and has to be tested on both platforms, app closed and app open, because getInitialURL and the url event follow two different paths. For a new Expo project I recommend Expo Router, which derives that configuration from the file tree; for an existing React Navigation project that works, migrating brings little as long as the navigation structure is stable.
Related terms
Expo Router
Expo’s file-based router: every file in the app directory becomes a screen, with deep links and typed routes out of the box.
Deep linking
Opening a specific screen of the app from a URL: a custom scheme (myapp://) or a verified https link (universal links, App Links).
Gesture Handler
Software Mansion’s library that recognizes gestures (pan, tap, pinch, and more) natively and composes them, with callbacks on the UI thread.
Reanimated
Software Mansion’s animation library that runs animations on the UI thread through worklets, without waiting on the JavaScript thread.