
React Native vs Flutter: which framework fits your app and your team?
Once you have decided on one codebase for iOS and Android, the choice usually narrows to React Native or Flutter. Both ship to the App Store and Google Play, and both can call native code. They differ in language, in how they draw the screen, in how much code you can share with a web app and in what upgrades cost later.
React Native vs Flutter: which fits each requirement?
Quick answer
React Native vs Flutter is mostly a team and interface decision: React Native fits teams that already write TypeScript and React and want to share logic with a web app, while Flutter fits products that need a custom interface that looks identical on every platform. Agnotic Technologies tests your hardest device requirement in both before committing.
| Criterion | React Native | Flutter |
|---|---|---|
| Team language | TypeScript or JavaScript with React | Dart; web developers usually need to learn it first |
| Sharing code with a web app | Business logic, types, state and API clients share well with a React web app; screens stay separate | Logic shares with other Dart code only; an existing React or Angular web app cannot reuse it |
| How the interface is drawn | Platform views, so controls follow each operating system | Flutter's own widgets painted by Impeller, so screens match across platforms |
| Custom UI and animation | Possible; heavy custom drawing often relies on community libraries or native views | A strength: everything on screen is drawn by the framework |
| Native SDKs to wrap | Native modules (Turbo Native Modules in the New Architecture) | Platform channels, or type-safe code generated with the Pigeon package |
| Bluetooth and health data | Not built in: community libraries or your own native module, tested on real devices | Not built in: plugins or your own platform channel code, tested on real devices |
| App size | Adds a JavaScript engine and bundle to the binary; measure your release build | Adds the Flutter engine to the binary; measure your release build |
| Updates without a store release | JavaScript bundle updates exist, but Guideline 2.5.2 bars downloaded code that adds or changes features | Dart compiles to native code, so updates normally ship through the stores |
| Upgrade effort | Upgrades can touch the native iOS and Android project files and every native dependency | Upgrades move the Flutter SDK, the Dart version and every plugin together |
| Testing | Jest for logic and component tests, plus a device end-to-end tool | Unit, widget and integration test layers in Flutter's own SDK |
What they are
What is React Native
React Native lets you write the app in JavaScript or TypeScript with React components, and renders platform views at runtime. Device APIs are reached through native modules. Its documentation states that from version 0.76 the New Architecture, with the Fabric renderer and Turbo Native Modules, is enabled by default in React Native projects.
What is Flutter
Flutter apps are written in Dart. Flutter's architectural overview says it bypasses the system UI widget libraries in favor of its own widget set, and that the Dart code painting the interface is compiled to native code and rendered with Impeller, which ships inside the app. Native APIs are reached through platform channels.
Key differences
Should the team's language decide it?
Often it is the strongest signal. React developers carry components, state and hooks straight into React Native, so a web team can contribute from the first sprint. Flutter needs Dart, which few web teams already know, though a team new to both frameworks starts level. Look at who will maintain the app two years from now, not only who builds the first release.
How does each framework draw the interface?
React Native maps its components to platform views, so a switch or a date picker looks like the one in other apps on that phone. Flutter paints every pixel with its own widgets; its documentation notes that Impeller ships with the app, so rendering improvements arrive with your release rather than with an operating system update. The result: Flutter screens look identical everywhere, React Native screens feel native on each platform. For native and WebView approaches, see our native vs hybrid app comparison.
How do you reach Bluetooth, health data and other native features?
Neither framework has these built in. React Native calls native code through native modules, and its New Architecture introduced Turbo Native Modules. Flutter's documentation describes platform channels: messages pass asynchronously between Dart and the host platform, with a MethodChannel on the Flutter side and matching channel classes on Android and iOS, or Pigeon to generate type-safe code. Either way, a Bluetooth medical device or a health data integration means writing and testing native code; build that spike first.
How much code can you share with a web app?
With React Native, a React web app and the mobile app can live in one repository and share TypeScript types, API clients, validation rules and state logic. The screens stay separate because the web renders HTML and mobile renders native views. Flutter can build for the web too, but it shares nothing with an existing React or Angular site. If a large web product already exists in React, that weighs toward React Native.
What do upgrades and testing look like over the app's life?
Both frameworks release often, so plan upgrades as recurring roadmap work. A React Native upgrade can change native project files, and each native library must support the version you move to. A Flutter upgrade moves the SDK, the Dart language version and every plugin together. Flutter ships unit, widget and integration testing in its SDK; React Native teams usually combine Jest with a device end-to-end tool. Both need real-device runs for Bluetooth, push notifications and background work.
When to use each
When to use React Native
- Your team already writes TypeScript and React for the web.
- You want to share business logic, validation and API clients with a web app.
- The interface should follow each platform's own controls and conventions.
- You are adding cross-platform screens to an existing native app one flow at a time.
When to use Flutter
- The product needs a custom, branded interface that looks the same on iOS and Android.
- Animation, charts or custom drawing sit at the center of the experience.
- The team is new to both frameworks and is willing to learn Dart.
- You also want desktop builds from the same codebase.
Which one? A short checklist, and how to switch later
1. Choose React Native if most of these hold: the team writes TypeScript and React, a React web app should share logic with the mobile app, and the interface should follow each platform's own controls.
2. Choose Flutter if most of these hold: the interface is custom and must match on every platform, animation or custom drawing is central, and the team is starting fresh or already knows Dart.
3. Either way, build your hardest native requirement first, such as pairing a Bluetooth device or reading health data, in the framework you favor.
4. Keep business rules in the backend API rather than the app. Switching frameworks later is a rewrite of the client, and a thin client is cheaper to rewrite.
5. To move gradually, embed the new framework in the existing app one flow at a time; both frameworks can be added to an existing native app.
6. Ship feature changes through store review, not as downloaded code, in line with App Store Guideline 2.5.2.