Journal — September 6, 2025 · 4 min read

React Native vs Flutter — An Honest Take After Shipping Both

A practical comparison of React Native and Flutter from someone who has shipped production apps in both — team fit, native modules, performance, and the decision that actually matters.

I've shipped production apps in both React Native and Flutter. People want this comparison to have a winner. It doesn't — but it does have a decision procedure, and it's shorter than you'd expect.

The one question that settles most cases

What does your team already write?

If you have React developers, use React Native. Not because it's better, but because the same people can ship mobile on Monday. Same JSX, same hooks, same state management, often the same validation and API code shared with the web app.

If your team is Dart-fluent, or has no web frontend at all and is starting clean, Flutter is a genuinely strong default.

That single question resolves maybe 70% of real decisions. Everything below is for the remaining 30%.

Where Flutter is straightforwardly better

Rendering consistency. Flutter draws every pixel itself with Skia. Your app looks identical on a flagship Pixel and a five-year-old budget Android — no platform quirks, no "why is the shadow different on iOS." If you have a design-heavy product with a custom design system, this removes an entire category of bug.

Animation. Flutter's animation system is better. Not marginally — genuinely better. Complex, interruptible, gesture-driven animation is pleasant in Flutter and fiddly in React Native. If your product's differentiation is motion, this matters a lot.

Performance ceiling. Compiled AOT to native ARM, no JavaScript bridge in the traditional sense. For animation-heavy or computation-heavy UI, Flutter has more headroom. React Native's new architecture narrowed this substantially, but the gap hasn't closed.

Tooling coherence. One official way to do most things. Less decision fatigue, less dependency archaeology.

Where React Native is straightforwardly better

The talent pool. There are vastly more React developers than Dart developers. Hiring, contracting, handing the project to someone else in two years — all easier. For a startup, this is a business risk, not a technical preference.

Code sharing with web. If you have a React web app, you can share types, API clients, validation schemas, business logic, sometimes state management wholesale. Flutter shares nothing with your web frontend unless you go all-in on Flutter Web, which I wouldn't for a public marketing-facing product.

The native escape hatch. When you need something the framework doesn't cover, React Native's native module story is well-trodden. Plenty of prior art, plenty of people who've done it.

Ecosystem maturity for integrations. Payments, analytics, auth, push, chat SDKs — most vendors ship a React Native SDK first and a Flutter one eventually. Check your specific vendors before committing; this is the thing that quietly derails timelines.

Expo. This is underrated. Expo has become genuinely excellent — OTA updates, managed builds, a huge library of vetted modules. For most apps you never touch Xcode. There's no Flutter equivalent with the same polish.

What doesn't actually matter

"Flutter is faster." True in benchmarks. Irrelevant for the overwhelming majority of apps, which are lists, forms, and network calls. Your app will not be slow because you chose React Native. It'll be slow because you're re-rendering a list of 500 items on every keystroke, and that mistake is available in both frameworks.

"React Native feels more native." It did when RN used platform widgets and Flutter didn't. Modern Flutter's Material and Cupertino widgets are close enough that users don't notice. Your users have never once thought about your rendering layer.

"Flutter apps are bigger." A few MB difference. Nobody has ever uninstalled an app over this.

The thing that actually bites

Both frameworks are fine until you need something they don't cover. Then you're writing platform code in Swift and Kotlin, and the question becomes: how painful is the bridge?

React Native's is more mature and more documented. Flutter's platform channels are cleaner conceptually but you'll find less prior art when you hit something obscure.

So: list your hard native requirements before you choose. Bluetooth, background location, a specific payment SDK, camera processing, healthcare integrations. Check each one has a maintained package in your candidate framework. Not "someone wrote one in 2022" — maintained. This ten-minute check prevents most of the disasters I've seen.

What I actually pick

Startup with React devs, standard app — React Native with Expo. Fastest path to shipping, easiest to hire for, and Expo removes most of the build pain.

Design-led product where motion is the point — Flutter. The animation advantage is real and you'll feel it every day.

Enterprise app, no existing web frontend, long-lived — Flutter. The consistency and single-way-to-do-things pay off over a multi-year maintenance window.

Heavy native integration — React Native, or honestly consider going fully native. If 40% of your app is platform-specific code, cross-platform is buying you less than you think.

The honest summary

Both are good. Both will ship your app. The failure mode is almost never the framework — it's picking the one your team can't staff, or discovering in month three that a critical SDK has no support.

Answer "what does the team write" and "do my native requirements have maintained packages." Those two questions decide it. Everything else is a preference you can defend either way, which means it isn't really a decision.