The Wrong Question, Asked Twice a Week
“Should we build in Flutter or React Native?”
We get this from clients almost every Monday. The honest answer is “it depends, and probably not for the reasons you think.” But the real failure mode is starting the conversation with that question at all.
The right starting point: what is this app actually doing, who’s maintaining it in three years, and does the team you have today match the framework you’re about to pick?
Once you’ve answered those, the Flutter-vs-RN call gets easier. Sometimes it’s Flutter. Sometimes React Native. Sometimes neither, because what you actually need is two native apps or a well-built progressive web app.
Here’s how we make the call.
What Each Framework Is Really Good At
Flutter and React Native solve the same business problem (one codebase, two app stores) using opposite technical strategies.
Flutter ships its own rendering engine. The Dart code talks to Impeller (Flutter’s modern renderer, now the default on both iOS and Android, with Skia kept only as an OpenGL fallback on older devices) which paints every pixel. You’re not using native UI components, you’re using Flutter widgets that look native because someone at Google did the work to match Material 3 and Cupertino styles.
React Native used to rely on an asynchronous JavaScript bridge. The New Architecture (JSI + Fabric + TurboModules + bridgeless mode, default since RN 0.76 and Expo SDK 52) replaced it with synchronous native calls. Your TextInput renders as a UITextField on iOS and an Android View (with growing Jetpack Compose interop) on Android, and the model is still “JS describes a tree, native renders it” using real platform components, just without paying the bridge tax.
Both work in production. Both have shipped apps with millions of users. The trade-offs are real and they pull in different directions.
When We Choose Flutter
We reach for Flutter when:
The UI needs to look identical across platforms. If brand consistency matters more than feeling perfectly native, Flutter wins. Your buttons, animations, and transitions render the same way on iPhone and a five-year-old Android. Pixel-for-pixel. Try that with React Native and you’ll spend a third of your time fighting platform inconsistencies.
The app is animation-heavy. Custom transitions, gesture-driven interfaces, anything where 60-120fps motion is part of the product. Flutter’s render-everything-yourself model gives you direct control over the frame.
The team doesn’t know JavaScript. Or the team is small and would rather learn one language well than juggle JS conventions across mobile, web, and backend.
You want desktop and embedded as cheap byproducts. Flutter ships to macOS, Windows, Linux, and embedded devices from the same codebase. Real teams use this for kiosk software, in-car displays, and B2B desktop tools. React Native has macOS and Windows ports, but they’re maintained by Microsoft and the experience is rougher.
Performance for compute-heavy or graphics-heavy work matters. Skia / Impeller renders fast. Dart compiles AOT to native code. For data visualization, custom maps, complex lists with thousands of items, Flutter has measurably less jank than RN.
Real-world adoption is solid. ByteDance, BMW, Toyota (in-vehicle infotainment via the Flutter embedder API), eBay Motors, and Alibaba all ship Flutter in production for things customers actually use. Statista’s 2025 mobile-developer survey puts Flutter at roughly 46% of cross-platform developers, ahead of React Native.
When We Choose React Native
We reach for React Native when:
The team already lives in React. If your web app is React, your developers think in JSX, and your shared utilities are in TypeScript, React Native lets a frontend developer ship a mobile app without context-switching to a new language. That hiring and onboarding gain is real.
You want to share substantial code with your web app. Not the UI (you’ll still have two trees), but the business logic, validation, types, and API client layer. Expo Router’s universal React Server Components are still in developer preview as of mid-2026, but the boundary between web and mobile is increasingly thin.
The app feels best when it feels native. A fintech transfer screen, a system-style settings page, a data-entry form. UIKit and Jetpack Compose components ship those interactions for free, including the small platform-specific behaviors (haptics, system sheets, share dialogs) that an end user notices subconsciously.
Hot reload + over-the-air updates matter operationally. Expo Application Services lets you push JS bundle changes without a store review. For a B2B internal app or a product that ships small fixes weekly, that’s a serious productivity win.
You need a mature library for one specific thing. React Native has wider third-party coverage than Flutter for niche needs (BLE, advanced camera, AR). Flutter is closing the gap, but for a 2026 project it still matters.
We covered the broader picture in our piece on native vs cross-platform mobile in 2026, but for cross-platform specifically, the decision usually lands on one of those team-fit reasons more than on a technical benchmark.
When Neither Wins
There’s a third path that gets dismissed too quickly. Sometimes the answer is two native apps, or no apps at all.
Native (Swift + Kotlin) is the right call when:
- The app integrates deeply with platform-specific APIs (HealthKit, CarPlay, Wear OS, Apple Watch).
- You only need iOS or only need Android, and your team has the budget for one platform now.
- You’re building something where 1% performance differences are visible to users (high-end games, real-time collaboration with custom rendering).
- You’re a team of 50+ where the maintenance overhead of two native codebases is no longer the bottleneck.
A well-built PWA is the right call when:
- The app is mostly content and forms.
- Your target users are on the web anyway and don’t really need to install anything.
- You want to avoid app store gatekeeping and can ship updates instantly.
- iOS Web Push and Badging API have shipped since iOS 16.4, so the old “iOS doesn’t really do PWAs” excuse is much weaker in 2026 (the Add-to-Home-Screen flow is still manual via Share, and the EU DMA situation around installed PWAs is worth checking before you bet on it).
Roughly a third of the “we need a mobile app” conversations we have end with “actually you need a better mobile web experience and a notification strategy.” It’s not the answer clients want to hear. It’s often the right one.
What We Ship for Clients
For consumer products with strong brand identity and animation: Flutter. We pair it with Riverpod for state, Drift for local persistence, and Firebase or Supabase for backend, depending on team familiarity.
For B2B mobile that complements an existing React web app: React Native with Expo. Same TypeScript codebase as the web product, shared API layer, EAS Build for the deploy pipeline. We’ve watched four-engineer teams ship a polished mobile companion app in eight weeks this way.
For a single-platform launch with platform-specific features: native. SwiftUI on iOS, Compose on Android, depending on which one you’re starting with. The cost of “going native” is now mostly hiring, not tooling.
The framework you pick matters less than you think. The team you put on it matters more. The architectural choices we wrote about in our tech stack decision framework apply here as much as on the backend.
The right framework is the one your specific developers can ship in without resentment.
That’s it. That’s the whole secret. Every framework comparison post pretends to be more complicated than this. None of them are.
Trying to choose between Flutter, React Native, native, or PWA for your next mobile project? Let’s talk through it. We’ll look at your team, your users, and your actual product, and tell you honestly which path costs you the least over three years.