Skip to content
RED SAGSkills

React Native interview questions and answers

React Native questions test how React works on mobile: native modules, performance and platform differences.

Below are 30 React Native questions with the correct answer and a short explanation, grouped from fresher to experienced level. Try each one before you open the answer.

What React Native interviews usually check

  • ✓Core components and styling
  • ✓Navigation
  • ✓The bridge, JSI and native modules
  • ✓Lists and performance
  • ✓Expo and builds

React Native interview questions for freshers easy

1. Raw text in React Native

In React Native, <View>Order placed</View> throws an error. Why?

  1. A.View cannot have any children
  2. B.Text strings must be inside a <Text> component
  3. C.React Native needs <div> for text
  4. D.Strings must be passed as a title prop
Show answer

Answer: B. Text strings must be inside a <Text> component

React Native has no HTML elements. View is a layout container, and every piece of text must be rendered inside <Text>, which maps to the native text view on iOS and Android.

2. Starting a new React Native app

What do the React Native docs recommend for starting a new app in 2026?

  1. A.Create React App with a mobile template
  2. B.Writing Java and Swift first, then adding React
  3. C.A framework such as Expo
  4. D.Using a WebView that loads the website
Show answer

Answer: C. A framework such as Expo

The React Native team recommends using a framework, and Expo is the main one. It provides routing, native modules, builds and over-the-air updates, so teams avoid setting up native tooling by hand.

3. Why list items need keys

Why should every item in a React Native FlatList have a stable, unique key?

  1. A.Keys tell FlatList which images to cache in memory, so recycled rows scroll faster and do not reload their pictures
  2. B.Keys are required before list items can receive touch events
  3. C.Keys let React match items between renders, so it updates, reorders and keeps item state correctly
  4. D.Keys are read out as accessibility labels by screen readers
Show answer

Answer: C. Keys let React match items between renders, so it updates, reorders and keeps item state correctly

React uses keys to know which item is which across renders. With stable keys (like a database id, via keyExtractor) inserts and reorders update only what changed and keep each row state attached to the right item. Using the array index as key can mix up state when items move.

4. Text outside a Text component

A React Native component returns `<View>Hello</View>`. What happens?

  1. A.It renders Hello in the default system font and colour
  2. B.It renders nothing at all and logs no warning
  3. C.It throws: text strings must be rendered within a <Text> component
  4. D.It works on Android but is ignored on iOS
Show answer

Answer: C. It throws: text strings must be rendered within a <Text> component

In React Native, View maps to a native container that cannot hold raw text. Strings must be inside a Text component, which maps to a native text view. The same error often appears from stray characters or a `{count && ...}` expression that renders 0.

5. Default flexDirection in React Native

Three Views are placed inside a parent View with no style. How are they laid out?

  1. A.Stacked vertically, because flexDirection defaults to column
  2. B.Side by side, because flexDirection defaults to row
  3. C.On top of each other, because position defaults to absolute
  4. D.In a wrapping grid, because flexWrap defaults to wrap
Show answer

Answer: A. Stacked vertically, because flexDirection defaults to column

React Native uses Yoga, a Flexbox engine, but its defaults differ from the web. flexDirection defaults to column, alignContent to flex-start, and flexShrink to 0. So children stack top to bottom unless you set flexDirection: 'row'.

6. Why React Native uses Hermes

Hermes is the default JavaScript engine for React Native. What is its main benefit on phones?

  1. A.Faster startup, as JS is precompiled to bytecode at build time
  2. B.It runs the JavaScript on the GPU for faster drawing
  3. C.It converts the JavaScript into Swift and Kotlin source
  4. D.It removes the need for any native code inside the app
Show answer

Answer: A. Faster startup, as JS is precompiled to bytecode at build time

Hermes compiles JavaScript to bytecode during the build, so the phone does not have to parse and compile source at launch. That improves time to interactive and lowers memory use, which matters most on low-end Android devices.

7. What EAS Build is for

What does Expo Application Services (EAS) Build provide?

  1. A.A database for storing user profiles
  2. B.Cloud builds of signed Android and iOS binaries
  3. C.A testing framework for React components
  4. D.A design tool for creating app icons
Show answer

Answer: B. Cloud builds of signed Android and iOS binaries

EAS Build compiles the app on hosted machines, manages signing credentials and outputs .aab, .apk or .ipa files. It means a Windows or Linux developer can still produce iOS builds. EAS Submit can then upload them to the stores.

8. Detecting app moving to background

You want to pause a video when the user switches to another app. Which React Native API reports this?

  1. A.AppState, with values like active and background
  2. B.Dimensions, with a change event on resize
  3. C.PixelRatio, with a background flag
  4. D.Vibration, with a pause listener
Show answer

Answer: A. AppState, with values like active and background

AppState emits change events with states such as active, background and (on iOS) inactive. Listening for a move away from active lets you pause media, save drafts or stop timers. Remove the subscription in the effect cleanup.

9. End-to-end tests for a React Native app

Which tool runs end-to-end tests that tap through a real React Native app on a simulator or device?

  1. A.Detox or Maestro
  2. B.ESLint or Prettier
  3. C.Metro or Babel
  4. D.Jest snapshot tests
Show answer

Answer: A. Detox or Maestro

Detox and Maestro drive the built app on simulators or devices and check what appears on screen. Jest with Testing Library tests components in Node without a device. ESLint and Prettier are static tools, and Metro and Babel build code.

10. Remote image does not appear

A React Native screen renders `<Image source={{ uri: avatarUrl }} />` and nothing shows, with no error. What is the most likely cause?

  1. A.Network images need an explicit width and height in the style
  2. B.Remote images only load when Hermes is disabled
  3. C.Images must be in the GIF format to load from a URL
  4. D.The Image component cannot load https addresses
Show answer

Answer: A. Network images need an explicit width and height in the style

React Native cannot know a remote image's size before it downloads, so without width and height (or flex sizing) the Image has zero size. Bundled images via require() carry their size automatically. Setting dimensions also avoids layout jumps when the image loads.

11. Expo Go and custom native code

An Expo app adds a library with its own native code, and it fails inside the Expo Go app. What is the usual fix?

  1. A.Create a development build that includes the native code
  2. B.Reinstall Expo Go from the store on the same phone
  3. C.Move the library import inside a try and catch block
  4. D.Switch the project from TypeScript to JavaScript
Show answer

Answer: A. Create a development build that includes the native code

Expo Go is a prebuilt app that contains only a fixed set of native modules, so it cannot load new native code. A development build (for example with expo-dev-client and EAS Build) is your own app binary with your native dependencies plus developer tools. Most production Expo apps use development builds.

React Native intermediate interview questions medium

12. React Native New Architecture

What is a key benefit of the React Native New Architecture (JSI, Fabric and TurboModules), which is the default in recent versions?

  1. A.It compiles JavaScript directly to Swift and Kotlin
  2. B.It removes the need for any native code
  3. C.JavaScript can call native code directly through JSI instead of sending async JSON messages over the old bridge
  4. D.It runs the app inside a WebView for better compatibility
Show answer

Answer: C. JavaScript can call native code directly through JSI instead of sending async JSON messages over the old bridge

The old architecture serialised every call into JSON and sent it asynchronously across a bridge, which added latency. JSI lets JavaScript hold references to C++ host objects and call them directly, even synchronously. Fabric is the new renderer and TurboModules load native modules lazily.

13. Listener without effect cleanup

What is the problem with this React Native effect?

useEffect(() => {
  const sub = AppState.addEventListener('change', onChange)
}, [])
  1. A.It never removes the listener; return () => sub.remove() so it is cleaned up when the component unmounts
  2. B.useEffect cannot use AppState
  3. C.The dependency array must contain AppState and onChange, otherwise the listener is never registered at all
  4. D.addEventListener must be awaited
Show answer

Answer: A. It never removes the listener; return () => sub.remove() so it is cleaned up when the component unmounts

Each time the component mounts it adds a listener, and without a cleanup function the listener stays alive after unmount. That leaks memory and calls handlers on dead components. Returning a cleanup function from useEffect removes the subscription at the right time.

14. What expo prebuild does

An Expo project has no android or ios folders in Git. What does `npx expo prebuild` do?

  1. A.Uploads the JavaScript bundle straight to the app stores
  2. B.Deletes all native code so the app runs in Expo Go
  3. C.Converts the project into a Flutter app
  4. D.Generates native projects from the app config and plugins
Show answer

Answer: D. Generates native projects from the app config and plugins

With Continuous Native Generation, native projects are treated as build output. prebuild creates android and ios folders from the app config and config plugins, so native settings live in code that is easy to review and upgrade. Many teams regenerate them in CI instead of committing them.

15. What Fabric is

In the React Native New Architecture, what is Fabric?

  1. A.The new JavaScript engine that replaces Hermes on Android
  2. B.A cloud service for distributing OTA updates
  3. C.The new renderer, with a shared C++ core for the UI tree
  4. D.A styling library that replaces StyleSheet
Show answer

Answer: C. The new renderer, with a shared C++ core for the UI tree

Fabric reimplements the renderer with a shared C++ core that builds and diffs the shadow tree. It supports concurrent React features and synchronous layout reads when needed. It works alongside Turbo Modules and JSI.

16. What autolinking does

Why do you rarely need to edit MainApplication or Podfile by hand when adding a React Native library?

  1. A.The library is compiled into the JS bundle by Metro itself
  2. B.Autolinking finds native code in node_modules and wires it in
  3. C.Hermes loads the native code at runtime from npm
  4. D.Native modules are no longer allowed in React Native
Show answer

Answer: B. Autolinking finds native code in node_modules and wires it in

The React Native CLI scans dependencies for native Android and iOS code and adds them to Gradle and CocoaPods. Manual linking is only needed for unusual setups. Expo config plugins go further and also adjust manifests and plists.

17. Querying in React Native Testing Library

Which query best follows React Native Testing Library's guidance for finding a "Submit" button?

  1. A.screen.getByRole('button', { name: 'Submit' })
  2. B.wrapper.find('TouchableOpacity').at(2)
  3. C.screen.UNSAFE_getByType(Pressable)
  4. D.component.props.children[3]
Show answer

Answer: A. screen.getByRole('button', { name: 'Submit' })

The library encourages queries that match how users and assistive tech see the screen: role, label and text. Such tests survive refactors that change component structure. Querying by component type or child index ties tests to implementation details.

18. What Kotlin Multiplatform shares

How does Kotlin Multiplatform (KMP) typically differ from Flutter and React Native?

  1. A.It shares only the UI and requires separate business logic
  2. B.It shares business logic in Kotlin while each platform can keep native UI
  3. C.It runs JavaScript on iOS through a Kotlin interpreter
  4. D.It replaces Swift with Dart on Apple devices
Show answer

Answer: B. It shares business logic in Kotlin while each platform can keep native UI

KMP compiles shared Kotlin code to JVM bytecode for Android and native binaries for iOS. Teams often share networking, storage and domain logic while keeping SwiftUI and Jetpack Compose screens. Compose Multiplatform can share UI as well if the team wants it.

19. React Native in a native app

What does "brownfield" React Native integration mean?

  1. A.Adding React Native screens to an existing native iOS or Android app
  2. B.Starting a new React Native app from the default template
  3. C.Running React Native code on a smart TV platform
  4. D.Moving a React Native app over to the Flutter framework
Show answer

Answer: A. Adding React Native screens to an existing native iOS or Android app

In a brownfield setup, a mature native app hosts a React Native root view for some screens, often new features. The native app owns startup and navigation, and the teams agree on how the two sides share data and routing. Large apps have used this to migrate step by step.

20. Shrinking a React Native Android app

A React Native Android app is 70 MB. Which step usually gives the biggest size reduction for users who install from Play?

  1. A.Upload an App Bundle so Play sends only the needed ABI
  2. B.Convert all of the PNG images to BMP format
  3. C.Disable Hermes and ship the plain JavaScript source
  4. D.Move every image into the JavaScript bundle
Show answer

Answer: A. Upload an App Bundle so Play sends only the needed ABI

A universal APK includes native libraries for all CPU architectures (arm64-v8a, armeabi-v7a, x86, x86_64), and React Native ships several large .so files. An App Bundle lets Play send only the matching ABI and screen density. Enabling R8 shrinking and removing unused assets helps further.

21. Unreadable JS stack traces in crashes

Crash reports from a release React Native build show stack frames like `index.android.bundle:1:84213`. What makes them readable?

  1. A.Turning on remote JS debugging for release builds
  2. B.Uploading the release source maps to the crash reporting tool
  3. C.Logging every function name with console.log
  4. D.Building the release with the debug flag set
Show answer

Answer: B. Uploading the release source maps to the crash reporting tool

Release bundles are minified and, with Hermes, compiled to bytecode, so frames point at offsets. The build can emit source maps (for Hermes, composed maps), and tools such as Sentry or Crashlytics use them to map frames back to original files and lines. Upload them for every release build.

22. Expo push token or FCM token

An Expo app gets a token from `getExpoPushTokenAsync()`. How is a push sent to that device?

  1. A.Your server sends it directly to APNs with the Expo token
  2. B.The device polls the Expo token endpoint every minute
  3. C.Expo tokens only work for local notifications
  4. D.Your server calls the Expo push service, which forwards to FCM or APNs
Show answer

Answer: D. Your server calls the Expo push service, which forwards to FCM or APNs

An Expo push token identifies the device to Expo's push service. Your backend sends messages to that service, which relays them to FCM on Android and APNs on iOS using credentials stored in EAS. Apps that need direct control can use getDevicePushTokenAsync and talk to FCM or APNs themselves.

23. Pages that should expire

An event page for a Dubai expo should drop from Google after the event. Which robots rule fits?

  1. A.unavailable_after with a date
  2. B.noarchive with the event name
  3. C.nosnippet on the event details
  4. D.max-snippet set to zero
Show answer

Answer: A. unavailable_after with a date

The unavailable_after rule tells Google to stop showing a page after a given date. It suits time-limited pages like events or offers. After that time, Google treats the page like noindex.

React Native interview questions for experienced candidates hard

24. Animation stutters while data loads

A React Native card animation stutters whenever a large JSON response is parsed. What is the usual fix?

  1. A.Run it on the UI thread (native driver or Reanimated)
  2. B.Use setInterval to drive the animation each frame
  3. C.Parse the JSON inside the animation callback instead
  4. D.Increase the animation duration so it hides the lag
Show answer

Answer: A. Run it on the UI thread (native driver or Reanimated)

JS-driven animations need the JavaScript thread every frame, so heavy JS work drops frames. useNativeDriver: true or Reanimated worklets run the animation on the UI thread, so it stays smooth even when JS is busy.

25. Animation stutters while JS is busy

A React Native Animated fade stutters whenever the JS thread is busy parsing a large response. Why, and what is the fix?

  1. A.The animation is driven frame by frame from the JS thread; use useNativeDriver: true for opacity and transform, or Reanimated worklets that run on the UI thread
  2. B.Hermes pauses timers while it parses JSON, so switching the engine to JavaScriptCore lets the Animated timing keep running during parsing
  3. C.Call setState more often so the animation keeps up
  4. D.Animations always stutter in React Native and nothing can fix it
Show answer

Answer: A. The animation is driven frame by frame from the JS thread; use useNativeDriver: true for opacity and transform, or Reanimated worklets that run on the UI thread

Without the native driver, each animation frame is calculated in JavaScript and sent to native, so a busy JS thread drops frames. The native driver sends the whole animation to the UI thread once, and Reanimated runs worklets there too. Heavy parsing can also be split up or moved off the JS thread.

26. OTA update crashes older installs

An OTA update that uses a new native library crashes users who still run the previous store build. What prevents this?

  1. A.A runtimeVersion that changes with native code changes
  2. B.Publishing the update twice so that both builds receive it
  3. C.Shipping the update with a larger JavaScript bundle
  4. D.Disabling Hermes so the bundle can load any library
Show answer

Answer: A. A runtimeVersion that changes with native code changes

expo-updates only delivers an update to builds with the same runtimeVersion. Tying runtimeVersion to the native fingerprint or app version means a bundle that expects new native code is never sent to binaries that lack it. Old binaries keep getting compatible updates only.

27. Turbo Modules and Codegen

In the React Native New Architecture, what does Codegen do for a Turbo Module?

  1. A.Converts the native module into pure JavaScript code
  2. B.Bundles the module into the Hermes bytecode file itself
  3. C.Creates a REST API that the module can call
  4. D.Generates typed native glue from a TypeScript module spec
Show answer

Answer: D. Generates typed native glue from a TypeScript module spec

You write the module interface as a typed spec in TypeScript or Flow. Codegen generates the C++ and platform glue at build time, so calls are type-checked across JS and native. Turbo Modules are also loaded lazily on first use, which helps startup.

28. Bridgeless mode in React Native

React Native 0.74 and later run in "bridgeless" mode under the New Architecture. What does that mean?

  1. A.The app no longer contains any native code at all
  2. B.JavaScript runs on the UI thread with no separate JS thread
  3. C.All native modules are removed and must be rewritten in JS
  4. D.The legacy async bridge is not started; calls go through JSI
Show answer

Answer: D. The legacy async bridge is not started; calls go through JSI

In bridgeless mode the runtime no longer creates the old message bridge. Rendering uses Fabric and modules use Turbo Modules over JSI. An interop layer lets many older libraries keep working, but code that touches bridge internals must be updated.

29. Reading the React Native perf monitor

The perf monitor shows UI at 60 fps but JS at 8 fps while a list is scrolling. What does this tell you?

  1. A.The GPU is overloaded and native views are dropping frames
  2. B.The device is low on storage space for the app
  3. C.The JS thread is overloaded, so touches and updates driven by JS will lag
  4. D.Hermes is disabled and JS is being interpreted
Show answer

Answer: C. The JS thread is overloaded, so touches and updates driven by JS will lag

The UI thread handles native drawing and scrolling, which is why the list itself still moves. The JS thread runs React renders and handlers; at 8 fps, state updates, taps and anything JS-driven will feel slow. Profile renders and reduce work per frame, for example with memoised rows or moving work off the JS thread.

30. Metro cannot find a shared package

In a monorepo, the React Native app imports `@acme/ui` from packages/ui, but Metro reports it cannot resolve the module. What is a common fix?

  1. A.Copy the shared package into the app's src folder by hand
  2. B.Publish the package to npm before every local change
  3. C.Configure Metro's watchFolders and node_modules paths for the workspace
  4. D.Run the app with Hermes disabled for that package
Show answer

Answer: C. Configure Metro's watchFolders and node_modules paths for the workspace

Metro only watches the project root by default and has historically had limits with symlinked workspaces. Adding the monorepo root to watchFolders and setting nodeModulesPaths (or using Expo's monorepo-aware default config) lets it see and resolve shared packages. Hoisting rules of the package manager also matter.

Ready to test yourself?

Take a 15-question React Native MCQ test with a score at the end, or practise the full React Native question bank and earn points on the leaderboard.