Software Engineering · Chapter 17 of 31
Cross-platform mobile, and how to actually choose
The migration that finished while nobody was looking, the adoption statistic everyone quotes wrongly, and the option that shares logic without sharing UI.
The cross-platform question is usually argued with a four-year-old statistic and a preference. This chapter gives you the current state of each option, what each genuinely solves, what each is genuinely wrong for, and a decision framework that does not require picking a winner.
React Native: the New Architecture is finished, not “rolling out”
This is the item most candidates are stalest on. The rewrite that replaced the asynchronous bridge with a synchronous native interface completed:
| Version | Date | What happened |
|---|---|---|
| 0.76 | Oct 2024 | New Architecture became the default |
| 0.80 | Jun 2025 | Legacy architecture frozen; deprecation warnings begin |
| 0.82 | Oct 2025 | First version running entirely on the New Architecture |
| 0.84 | Feb 2026 | Legacy architecture components removed from iOS and Android |
| 0.87 | Aug 2026 | Strict TypeScript API becomes the default; Swift Package Manager support |
So “is the New Architecture optional?” has a clean answer: no. The legacy components were deleted in February 2026. Anyone describing it as a migration you can defer is describing 2024.
What React Native uniquely solves is not code sharing — it is over-the-air updates. You can ship a JavaScript bug fix without an app store review cycle. That single capability is why it survives in product organisations that measure time-to-fix, and it is a genuine architectural advantage rather than a convenience.
What it is genuinely wrong for: anything where the JavaScript thread is the bottleneck — real-time graphics, camera and augmented-reality pipelines, audio signal processing, high-frequency gesture-driven canvases. And it is wrong for a team with no native engineers at all: removing the bridge did not remove Xcode, Gradle, provisioning profiles or dependency managers. Note also that the framework's own documentation now steers new projects to Expo — bare React Native is the unusual choice in 2026.
Flutter: alive, and structurally different from the 2024 panic
Version 3.47 (12 August 2026) made three changes that matter architecturally: the Material and Cupertino design systems became opt-in standalone packages, decoupling design-system releases from the SDK; the newer rendering engine became the default on desktop platforms, eliminating first-play shader stutter; and web is moving toward WebAssembly by default.
Get the layoff story right, because it is used badly in both directions.
The cuts were in April 2024 — roughly 200 people across a combined Flutter, Dart and Python organisation. They did not kill the project. The teams shipped eight stable releases across 2025 on a quarterly cadence.
The genuinely negative signal is a different one: the Dart macros project was cancelled in January 2025 after more than two years of work, citing unacceptable hot-reload degradation. That is a real setback for ambitious language work — and it is distinct from the framework's health.
Being able to separate those two is the mark of someone who read past the headline.
What Flutter uniquely solves: pixel-identical rendering everywhere, because it draws every widget itself rather than wrapping platform ones. Plus best-in-class hot reload and a genuine six-target story. For design-led products where brand consistency beats platform convention, nothing else is close.
What it is genuinely wrong for: anything that must feel like a native OS application — because it renders its own widgets, accessibility, text selection and platform-idiom behaviours are approximations. Anything with heavy native SDK integration, since every plugin is a bridge somebody maintains. And web, where the bundle size and absence of a real DOM make it unsuitable for anything indexable.
The adoption statistic to stop quoting
“Flutter 46%, React Native 35%” is the most-repeated and least-sourced number in mobile engineering. It traces to a survey whose underlying fieldwork appears to be from 2022–23, and it is re-quoted every year as though it were fresh.
Better-grounded figures, still secondary: Flutter reached roughly 30% of new free iOS apps in 2025, up from about 10% in 2021, with React Native estimated at 15–18%.
And the revenue picture reverses it: as of late 2025, roughly 173 React Native apps earned a million dollars a month or more, against 37 built with Flutter.
The defensible synthesis: Flutter wins on volume of new apps shipped — independent developers, agencies, emerging markets, design-led work. React Native wins on revenue-weighted and enterprise presence, where a web team already exists and over-the-air updates matter.
Teaching the split is a much better interview answer than either number alone, and it is also simply more true.
Kotlin Multiplatform: the option that does not force shared UI
This is the genuinely distinct bet and the one most people misunderstand. Kotlin Multiplatform lets you share networking, persistence, business logic and models while writing SwiftUI on iOS and Compose on Android. Sharing the UI as well — via Compose Multiplatform — is an optional extra step, not the premise.
That means it is the only mainstream option that keeps 100% native UI fidelity. If your objection to cross-platform has always been “it never quite feels right”, this is the answer to that objection.
- Compose Multiplatform for iOS reached stable in May 2025 — real iOS scroll physics, native text selection, accessibility wiring.
- Compose Multiplatform for web is beta, not stable. Stable means Android, iOS and desktop. That distinction is exactly the kind of thing an interviewer probes, and getting it right signals you checked rather than assumed.
- Named production users include a major streaming service, a payments app, a document editor's iOS client, a language-learning app and a cloud provider's SDK. Reported adoption of over fifteen thousand production apps is press-sourced rather than vendor-published — use it as direction, not fact.
- Wrong for: teams without existing Kotlin and Android expertise — the on-ramp is Gradle and native tooling, which is brutal for a JavaScript team. Also wrong for web as a primary target, and anywhere you need a large third-party component ecosystem.
Native, and where it landed
Google declared Android UI development ‘Compose-first’ on 19 May 2026. All APIs, libraries, tooling and guidance go to Compose first; the classic view system, fragments and the older list components move to maintenance mode — explicitly not deprecated, still getting critical fixes, but no new features. All new Android Studio UI tooling is Compose-only.
On Apple's side, SwiftUI is the default for new projects and receives the majority of the UI innovation. The honest teaching line is: SwiftUI is mature enough to build a whole app in, and still has escape hatches you will use — the representable wrappers — for list performance edges, complex text input and anything not yet wrapped. “SwiftUI or UIKit” is now “SwiftUI with UIKit where it does not reach”, not a fork in the road.
The decision framework
| Situation | Choose |
|---|---|
| Content-shaped app, small team, a web team already exists | React Native + Expo — and the OTA update path is the reason, not the code sharing |
| Design-led, brand-consistent across many platforms, no native team | Flutter |
| Two strong native teams who want to stop writing the same networking layer twice | Kotlin Multiplatform, with shared UI optional |
| Platform-idiomatic, deep OS integration, performance-critical, or single-platform | Native |
| The app is fundamentally a website with a launcher icon | Build a website. This is the most commonly skipped branch and it is right more often than anyone admits |
Check yourself