On this page
If you are planning a mobile app for iOS and Android, the first technical decision is usually whether to build it twice natively or once with a cross-platform framework. For most products, the realistic cross-platform shortlist is React Native and Flutter. Both are backed by large companies, both ship apps used by millions of people, and both changed significantly in the last two years. This guide explains what changed, how the two differ in practice, and how to decide.
The short answer
There is no universal winner. React Native tends to be the better fit when your team already writes React and TypeScript, when you want to share business logic or developers with a web product, or when you want your app to use the platform's own native UI components. Flutter tends to be the better fit when you want a fully custom design that looks identical on every device, when animation-heavy UI is central to the product, or when you are starting a team from scratch and are happy to adopt Dart.
What changed recently
React Native: the New Architecture is now the only architecture
React Native spent several years replacing its original design, where JavaScript and native code communicated through an asynchronous bridge. The replacement, called the New Architecture, is built on three parts: JSI (a direct interface between JavaScript and native code), Fabric (the new rendering system) and TurboModules (lazily loaded native modules).
- React Native 0.76 (October 2024) made the New Architecture the default for new projects.
- React Native 0.80 (June 2025) froze the Legacy Architecture and began warning about APIs that would stop working.
- React Native 0.82 (October 2025) runs only on the New Architecture. Setting
newArchEnabled=falseon Android orRCT_NEW_ARCH_ENABLED=0on iOS is ignored. React Native 0.81 and Expo SDK 54 are the last versions that allow the Legacy Architecture.
In practice this matters for two reasons. First, every current app runs without the old asynchronous bridge and its serialisation overhead. Second, any third-party library you depend on must support the New Architecture, so checking library compatibility is now a normal part of planning a React Native project.
Flutter: Impeller replaces Skia on mobile
Flutter draws every pixel of its UI itself rather than using the platform's native widgets. For years it did this with the Skia graphics library. Its newer renderer, Impeller, precompiles shaders so animations do not stutter the first time they run.
- As of Flutter 3.27, Impeller is the default renderer on iOS and on Android API 29 and above.
- On iOS, Impeller is the only supported renderer.
- On Android devices running older versions, or without Vulkan support, Flutter falls back to its legacy OpenGL renderer.
- Flutter on the web still uses Skia.
How each framework works
React Native
You write your app in JavaScript or, more commonly, TypeScript using React components. React Native turns those components into real native views, so a button is a genuine iOS or Android view. The React Native team recommends starting new apps with a framework such as Expo, which handles builds, over-the-air updates and many native capabilities for you.
Flutter
You write your app in Dart. In release builds Dart compiles ahead of time to native machine code, and Flutter renders its own widget tree using its engine. It ships with Material and Cupertino widget sets, but because it paints its own UI, your design looks the same on every device unless you choose to adapt it per platform.
Side-by-side comparison
| Factor | React Native | Flutter |
|---|---|---|
| Language | TypeScript or JavaScript | Dart |
| UI approach | Real native platform views | Draws its own widgets |
| Look and feel | Feels native by default | Identical across platforms by default |
| Rendering | Fabric (New Architecture) | Impeller on iOS and Android API 29+ |
| Web code sharing | Strong, especially with React and Next.js | Possible, but web output differs from typical websites |
| Hiring pool | Large overlap with web React developers | Growing, with fewer developers who also work on web |
| Dev loop | Fast Refresh | Hot reload |
| Tooling for new apps | Expo recommended | Flutter SDK and CLI |
Performance: where it really matters
For typical business apps, such as forms, lists, dashboards, booking flows and chat, both frameworks are fast enough that users will not notice a difference. Performance problems in these apps almost always come from the implementation: oversized images, unvirtualised long lists, too many re-renders, or slow APIs.
The framework choice starts to matter in a few specific cases:
- Complex custom animation and graphics. Flutter's rendering model gives you precise control over every frame, which suits highly animated, brand-led interfaces.
- Heavy use of native platform UI. If your app should look and behave exactly like other iOS and Android apps, React Native's native views make that easier.
- Intensive on-device work such as real-time video processing or large offline datasets. Here you will likely write native modules in Swift or Kotlin with either framework.
Team skills and hiring
Over the life of a product, people cost more than any framework difference. If your company already has React developers building a web app, React Native lets them contribute to mobile with a short learning curve, and your engineers can move between web and mobile work. If you are building a new mobile team, Flutter's single toolkit and consistent documentation make onboarding straightforward, and Dart is easy to learn for developers who know Java, Kotlin, Swift or TypeScript.
Sharing code with your web product
Many products need a web app and a mobile app. With React Native you can share TypeScript types, validation rules, API clients and state management with a React or Next.js web app, usually through a monorepo. UI components are generally still written separately for web and mobile, because good mobile and web interfaces differ. Flutter can also target the web, but its web output is best suited to app-like experiences rather than content sites that need strong SEO.
When to choose native Swift and Kotlin instead
Cross-platform is not always the right answer. Consider fully native development when:
- The app depends on deep platform features such as advanced camera pipelines, background processing, widgets, watch apps or car integrations.
- You need day-one support for new operating system features.
- You have the budget and product maturity to maintain two dedicated codebases and teams.
A decision checklist
- Who will build and maintain the app for the next three years? Match the framework to that team's strengths.
- Do you have, or plan, a React web app? If yes, React Native's code and skills sharing is a strong advantage.
- Is a custom, animation-rich design central to the product? If yes, Flutter deserves a serious look.
- Which native features do you need? List them and check library support for each in both ecosystems before deciding.
- Build a thin prototype of your riskiest screen in the leading option, and test it on low-end devices.
If you already have an app
Rewriting a working app is rarely worth it just to switch frameworks. If you have an older React Native app, the more urgent task is usually upgrading to a current version, which now means completing the move to the New Architecture and replacing libraries that do not support it. Plan that upgrade in stages: move to 0.81 or Expo SDK 54 with the New Architecture enabled, fix incompatible libraries, then upgrade further.
Not sure which path fits your product? We can review your requirements and recommend an approach as part of our mobile app development service, or you can start a conversation with us directly.
Common questions
Is React Native or Flutter faster?
For most business apps, neither is noticeably faster to users. Flutter gives more direct control over rendering for animation-heavy interfaces, while React Native renders real native views. Implementation quality matters far more than the framework.
Can I still use the old React Native architecture?
Not on current versions. From React Native 0.82 the New Architecture is mandatory. React Native 0.81 and Expo SDK 54 are the last versions that allow the Legacy Architecture.
Which is better for a startup MVP?
Choose the one your team can ship with fastest. If your founders or developers know React, React Native with Expo is usually the quickest route. If you are hiring fresh and want a custom UI, Flutter is an equally valid choice.
Sources
- React Native 0.82: A New Era (React Native)
- React Native blog (0.76 and 0.80 release notes) (React Native)
- React Native's New Architecture (Expo documentation)
- Impeller rendering engine (Flutter documentation)