
Most "Flutter vs React Native" posts end in a benchmark. This one does not, because for the apps most teams are asked to build, the benchmark is not what decides it. The two frameworks get to the same place, one codebase for iPhone and Android, in opposite ways, and that one architectural choice explains nearly every difference you will run into later: how the app looks, who can maintain it, how much of it you can share with a website, and how it ages.
We build cross-platform apps in Flutter, so we are not neutral, and we say below when React Native is the better pick anyway.
TL;DR
- Rendering: Flutter paints every pixel with its own engine; React Native drives the real iOS and Android UI components from JavaScript.
- Look: Flutter looks the same everywhere; React Native looks native everywhere.
- Staffing: in Stack Overflow's 2024 survey, 62.3% of respondents used JavaScript and 38.5% TypeScript, against 6% for Dart.
- Performance: for typical business apps, users cannot tell. Flutter leads on heavy custom animation, React Native on standard platform screens.
- Web: neither should build your marketing website. React Native's real web advantage is sharing TypeScript with a React or Next.js site.
- Rule: React team already? React Native. Starting fresh with a branded, identical-on-both-phones design? Flutter.
Where they stand in October 2026
| Flutter | React Native | |
|---|---|---|
| Made by | Meta; owned by the React Foundation since February 2026 | |
| Language | Dart | JavaScript or TypeScript |
| Screen drawn by | Its own engine, Impeller | The platform's own UI components |
| Latest version | 3.47 (August 2026) | 0.87 (August 2026) |
| Release rhythm | Stable release every three months | New version every two months |
| Recommended start | The Flutter SDK and its tools | Expo, as the React Native docs advise |
One draws the pixels, the other borrows them
Flutter brings its own drawing engine. Dart is compiled ahead of time to machine code, and Impeller, the default renderer on iOS and on Android 10 and newer since Flutter 3.27, paints every button, text run and animation itself through the GPU. Impeller precompiles its shaders when the engine is built, which is what removed the first-run animation stutter older Flutter apps were known for.
React Native does the opposite. Your JavaScript runs in Hermes, the engine Meta built for phones, and tells iOS and Android which of their own components to show. Since 0.82 it runs only on the New Architecture, where JavaScript calls native code directly instead of serialising messages over the old bridge, and since 0.84 a new version of Hermes is the default engine.
The same button makes the difference concrete. In Flutter:
ElevatedButton(
onPressed: checkout,
child: const Text('Pay now'),
)
That is a Flutter widget, drawn by Flutter. It is pixel for pixel identical on both phones, and it only looks like an iOS button if someone designs it to. In React Native:
import { Button } from 'react-native'
<Button title="Pay now" onPress={checkout} />
That renders the platform's own button: a UIKit button on iOS, an Android button on Android. It picks up each system's look, text handling and accessibility behaviour for free, and it changes when Apple or Google change theirs.
Neither is better in general: a bank or a shop with a strong brand usually wants the first, a utility that should feel like part of the phone usually wants the second. That is the question to answer before any benchmark.
The language is a staffing decision
Dart is a pleasant language, and anyone who knows TypeScript, Kotlin or Swift picks it up quickly. The issue is the pool. A React Native app can be maintained by any React developer, and the Stack Overflow numbers above show how many more of those there are. Outside Flutter, Dart is rarely used, so a Flutter app needs people who chose Flutter.
The bigger practical gain on the React Native side is sharing code with a website. If the product already has a React or Next.js frontend, the data models, validation and API client can live in one TypeScript package used by both:
// packages/shared/order.ts — imported by the Next.js site and the React Native app
export type OrderLine = { sku: string; qty: number }
export function orderTotal(lines: OrderLine[], prices: Record<string, number>) {
return lines.reduce((sum, l) => sum + (prices[l.sku] ?? 0) * l.qty, 0)
}
A Flutter app next to a React website is two codebases in two languages, and that logic gets written twice. For a team that owns both, this often decides it on its own.
Performance: mostly a wash, with two edges
For lists, forms, a map, payments and push notifications, both are fast enough that users cannot tell which was used. The edges are real but narrow. Flutter has the advantage with heavy custom animation and complex drawn interfaces, because it owns every frame. React Native has the advantage when the app is mostly standard platform screens, long native lists and system components, because those are the platform's own code.
Be careful with the benchmarks you find. Most compare a small demo built by one person who knows one of the two frameworks much better than the other, and both frameworks replaced their rendering path in the last two years, so anything older than that measures software that no longer ships. What makes real apps slow is usually the same in both: work on the main thread, images far larger than the screen, and too many requests to a slow API.
The web is where they differ most
Both can run in a browser: Flutter directly, React Native through React Native for Web, which Expo sets up for you. Neither is how you should build the pages people find on Google. Flutter's own documentation says it is not suitable for static, text-rich websites and that its output does not match what search engines need to index it properly; its advice is to build landing pages, marketing and help content in normal HTML and keep Flutter for the app.
That is our advice for both frameworks. The website is a website, ideally a fast static one. The app is what people use once they are customers.
When a native feature is the whole point
Building natively means two apps, Swift and SwiftUI for iPhone and Kotlin for Android, at roughly twice the build and maintenance cost. It is worth it when the app lives on platform features: home-screen and lock-screen widgets, Apple Watch or Wear OS, CarPlay, augmented reality, heavy background work such as tracking or Bluetooth devices, or when you only need one platform.
For everything else, neither framework locks the platform out. You write the one native piece per platform and call it from the shared code. In Flutter that is a platform channel:
const channel = MethodChannel('app/battery');
final level = await channel.invokeMethod<int>('getBatteryLevel');
with a small Swift and Kotlin handler on the other end. React Native's New Architecture does the same through native modules. Either way, the piece written twice is one feature, not the whole app.
Plan for upgrades from day one
Flutter ships a stable release about every three months: 3.38 in November 2025, then 3.41, 3.44 and 3.47 through 2026. React Native ships roughly every two months, 0.84 to 0.87 between February and August 2026, and since February it belongs to the React Foundation under the Linux Foundation, with Meta, Microsoft, Amazon, Expo, Callstack, Software Mansion, Vercel and Huawei among its founding members. Neither is going anywhere.
That pace is the real maintenance cost. Apple and Google raise the minimum SDK versions they accept every year, and the framework, its plugins and the build tools have to move with them. An app nobody updates for a year eventually cannot ship an update at all. A small upgrade every few months is routine. A jump across two years of versions is a project, so it belongs in the budget from the start.
How we choose
If the team already writes React, choose React Native; if you are starting fresh and the design should be identical on both phones, choose Flutter. Then check the exceptions: an app that should look exactly like the system leans to React Native, rich custom animation leans to Flutter, widgets, wearables or hardware lean to native. If none of them applies, the deciding question is who will maintain the app in three years.
When a project calls for one codebase, we build it in Flutter, because the apps we are asked for are usually branded products that should look the same everywhere, and because the same Figma design goes to both stores without platform differences. When a client already has a React team, React Native is the better choice, and we tell them so.
Originally published on levelui.com, with who uses each framework in production, the full source list and answers to the questions clients ask: whether Google is abandoning Flutter, who owns React Native now, and when to build natively. Also available in German and Romanian.
This copy is a snapshot from the day it was posted, and it will not be updated here. The original on levelui.com is the version we keep current: when a framework ships a new version, a figure changes or a tool is renamed, that is where the correction lands. If you want the up-to-date version, follow the link above.
We are Level UI, a web design and development agency in Bucharest.
About the author
- We are Level UI, a web design and development agency with offices in Bucharest and Berlin. We write about web performance, Next.js, image and font loading, APIs, AI integrations and app development, with real figures and sources. The maintained versions of every article are on levelui.com, levelui.de and levelui.ro.
Comments
Join the discussionNo comments yet. Be the first to comment.

