Skip to content

React Native vs Flutter: how we actually choose

Ingenious Techlab Team3 min read
Contents
  1. First: should this be cross-platform at all?
  2. The question that decides it most often
  3. Where Flutter is genuinely better
  4. Where React Native is genuinely better
  5. How this plays out on a new platform
  6. What we do not weigh heavily
  7. The short version

Comparison posts on this usually end in “it depends on your needs,” which is true and useless. Here is the decision procedure we actually run, in the order we run it.

First: should this be cross-platform at all?

Worth settling before comparing the two, because the answer changes the shortlist.

Cross-platform is the right default when your app is content, form or data-led. Native earns its extra cost when the product depends on the platform itself — sustained camera pipelines, background location, deep OS integration, or a profiled performance ceiling in the framework layer.

If you are in native territory, neither of these is your answer.

The question that decides it most often

What does your team already know?

This is unglamorous and it outweighs nearly every technical difference. React Native is JavaScript and TypeScript with React’s component model. If you have web developers, they are productive in days rather than months, and — more importantly — they can still review each other’s code.

Flutter is Dart. It is a pleasant language and genuinely quick to learn, but it is a language almost nobody already has, which means a hiring pool that is smaller in Canada than the JavaScript one.

If you have an existing React web app, React Native also lets you share types, validation schemas and business logic. That is a real, ongoing saving rather than a one-time one.

Where Flutter is genuinely better

Rendering consistency. Flutter draws its own widgets, so a screen looks identical on both platforms and across OS versions. If you have an exacting design system and pixel fidelity matters, this removes a whole category of bug.

Animation-heavy interfaces. The rendering model handles complex custom animation more predictably.

Compile-time safety. Dart’s sound null safety catches at compile time a class of error that TypeScript, sitting on JavaScript, cannot fully rule out.

Where React Native is genuinely better

The native module escape hatch. This is the one that decides real projects. When you need platform capability the framework does not wrap, you write a native module. In React Native this is well-trodden — the ecosystem is large and most things you need already have a maintained package.

Flutter’s plugin ecosystem is good and improving, but for a niche SDK you are more likely to be writing the bridge yourself.

Ecosystem depth generally. More packages, more Stack Overflow answers, more people who have hit your exact problem.

Web reuse. Shared logic with an existing React codebase, as above.

How this plays out on a new platform

A useful stress test is what happens when a platform ships something new.

Our own iPhone Duo work is a current example. When Apple shipped a foldable, Flutter already had a foldable abstraction from Android — MediaQuery.displayFeatures — but whether it is wired to the new iOS APIs is a separate question from whether the abstraction exists. React Native shipped no foldable support at all, so adaptation goes through the native module path.

Neither framework is simply “ahead” there. But it illustrates the pattern: on a brand-new platform capability, both need native work, and the framework with the better escape hatch reaches parity sooner.

What we do not weigh heavily

Benchmarks. Both are fast enough for the apps most businesses build. If you are in the small minority where framework overhead is the bottleneck, you are probably going native anyway.

“Flutter is backed by Google.” So was a long list of discontinued Google products. Community size and maintainer activity are better signals than corporate sponsorship.

Which is trending. Both are mature. Neither is disappearing this decade.

The short version

  • Existing JS/TS team, or an existing React web app → React Native
  • Exacting cross-platform design fidelity, or animation-heavy UI → Flutter
  • Unusual native SDK integration → React Native, for the escape hatch
  • Platform-dependent product → neither; go native

Four of the five apps we have shipped are cross-platform, and the deciding factor was the team that would maintain them after we handed over. That is usually the right tiebreaker: the build is months, the maintenance is years.

This post is part of our work onMobile app development for iOS and Android.

Related reading

Tell us what you are building

Send us the scope and we will come back with an honest assessment: what it takes, roughly what it costs, and whether we are the right people for it.