Building a mobile app used to mean two projects: one for iPhone and another for Android, often written by two different teams. Today, many teams pick a cross-platform framework instead, write the app once and ship it to both app stores. Flutter and React Native are the two names on nearly every shortlist.
But Flutter vs Expo isn’t quite a contest between two rival frameworks. Expo is the framework and toolchain the React Native team recommends for building React Native apps, so the real choice is between Flutter and React Native built with Expo. It decides which language your team writes, how your app draws its screens and how you ship updates for years to come.
This guide compares the two on architecture, design, performance, tooling, web support and cost, with real apps built with each and a clear view of which one suits your team.
Flutter vs Expo at a Glance
Flutter and React Native with Expo both build iOS and Android apps from one codebase, but they share almost nothing under the hood. Flutter brings its own language and draws its own interface, while Expo builds on React Native, which uses JavaScript and each platform’s own native components.
| Flutter | React Native with Expo | |
|---|---|---|
| What it is | A UI framework and SDK from Google | A framework and cloud services for React Native, from the company Expo |
| Latest stable release | Flutter 3.47 (August 2026), with Dart 3.13 | Expo SDK 58 (October 2026), with React Native 0.88 |
| Language | Dart | JavaScript or TypeScript, with React |
| How it draws the screen | Its own engine, Impeller, draws every pixel | Each platform's native components |
| Release code | Compiled ahead of time to native machine code | JavaScript compiled to Hermes bytecode, inside a native app |
| Platforms | iOS, Android, web, Windows, macOS and Linux | iOS, Android and web |
| Live reload while coding | Stateful hot reload, on mobile and web | Fast Refresh, which keeps component state |
| Custom native code | Platform channels to Swift, Kotlin and other native code | Expo Modules API, in Swift and Kotlin |
| Cloud builds and store submission | Not included: build with Xcode and Android Studio or your own CI | EAS Build and EAS Submit |
| Over-the-air updates | Not included; third-party services such as Shorebird | EAS Update |
| Cost | Free and open source | Free and open source; cloud services from $0, paid plans from $19 a month |
What Is Flutter?
Flutter is Google’s open-source framework for building apps for mobile, web and desktop from a single codebase. Google ships a new stable version about every three months, and Flutter 3.47 arrived in August 2026.
Flutter apps are written in Dart, a language Google also makes. While you develop, Dart runs on a virtual machine that supports hot reload. For release, it’s compiled ahead of time into native ARM or x64 machine code for each platform.
Flutter’s defining choice is how it draws the screen. Instead of using the buttons, lists and text fields iOS and Android provide, it paints every pixel itself with its own rendering engine, Impeller.
Impeller is the only renderer on iOS, the default on Android 10 and later and, since Flutter 3.47, the default on Windows, macOS and Linux too. On top of it, Flutter’s widgets come in two design systems: Material, Google’s own, and Cupertino, which follows Apple’s design guidelines.
What Is Expo, and How Does It Relate to React Native?
Expo is an open-source framework and set of tools for building React Native apps. It isn’t an alternative to React Native: an Expo app is a React Native app, written with React Native’s components, with Expo’s libraries and tooling around it.
React Native is the framework Meta created for building iOS and Android apps with React. Since February 2026, it has been owned by the React Foundation, hosted by the Linux Foundation, with Meta, Microsoft, Amazon and Expo among its founding members.
React Native’s own setup guide recommends starting new apps with a framework, and says most developers benefit from one like Expo. Without one, you write your own solutions to core features or piece together libraries to do the same job.
Expo adds what plain React Native leaves to you:
- Expo Router, file-based navigation for iOS, Android and the web, where every screen can be opened from a link
- The Expo SDK, a library of native modules for things like the camera, notifications and contacts
- Continuous Native Generation, which generates the iOS and Android projects from your app’s config, so nobody maintains native folders by hand
- The Expo Modules API, for writing your own native modules and views in Swift and Kotlin
- Expo Application Services (EAS), optional cloud services for builds, store submission and over-the-air updates
Expo Go, a free app for opening a project on your phone, is handy for experiments. For an app you’ll publish, Expo recommends a development build, which is your own version of Expo Go with any native libraries your app needs.
How Do Flutter and React Native Draw the Screen?
Flutter and React Native take opposite approaches to drawing an app’s interface, and most of their other differences follow from that one choice.
Flutter owns the whole stack. Your Dart code builds a tree of widgets, and Flutter’s engine lays them out and paints them with the phone’s graphics hardware. The platform’s own UI toolkit isn’t involved, which is why a Flutter app looks the same on an older Android phone and a new iPhone.
React Native hands the drawing to the platform. Your JavaScript describes the interface with components like View and Text, and React Native turns them into real native views, the same ones a Swift or Kotlin app would use.
The connection between JavaScript and native code used to be React Native’s weak spot. Older versions sent every message through an asynchronous bridge, which had to serialize the data each time.
The New Architecture replaced that bridge with the JavaScript Interface (JSI). JSI lets JavaScript call native code directly, with no serialization, and read layout synchronously, so screens don’t visibly jump as they settle.
React Native 0.82, released in October 2025, was the first version to run entirely on the New Architecture. On the Expo side, SDK 54 was the last version where you could turn it off.
Neither is a hybrid framework that renders its screens as web pages, the way Ionic does. Both produce native apps; they just build the screens in different ways.
Which Gives You More Control Over Design?
Flutter gives you more control over design, because it draws everything itself. Custom shapes, transitions and animations behave the same on every platform, and you’re never limited by what the native components can do.
That makes Flutter ideal for brand-led apps where the interface itself sets you apart. Since Flutter 3.47, its Material and Cupertino widgets also ship as standalone packages, separate from the core framework.
React Native built with Expo gives you each platform’s own look for free. Lists scroll, text fields behave and menus open the way iPhone and Android users expect, because they’re the real native controls.
Expo UI goes further, letting you build screens from SwiftUI components on iOS and Jetpack Compose components on Android, straight from React. The trade-off is that a pixel-perfect custom design takes more work to match across both platforms than it does in Flutter.
Is Flutter Faster Than React Native?
Flutter has the edge in raw rendering performance, but for most business apps the difference is too small for users to notice. Both frameworks run smoothly on modern phones.
Flutter compiles to machine code and draws every frame itself, so it never waits on a hand-off between two runtimes. Impeller also compiles its shaders when the engine is built rather than while your app runs, which avoids stutter the first time an animation plays.
React Native closed much of the gap with the New Architecture. JSI removed the cost of passing messages across the bridge, and Hermes, React Native’s default JavaScript engine, compiles your code to bytecode at build time so apps start faster.
You’re most likely to see a difference in:
- Long, complex animations and custom transitions
- Apps that draw their own graphics, like charts, editors and games
- Screens with many layered, moving elements
For ecommerce, content, booking and productivity apps, either framework is fast enough. How well your team builds the app matters more than which framework it uses.
Developer Experience: Language, Tooling and Hiring
Expo’s biggest advantage is that it runs on the languages most developers already know. In Stack Overflow’s 2026 Developer Survey, 62% of the 14,099 developers who answered had done extensive work in JavaScript over the past year and 44% in TypeScript, against 4.9% in Dart.
That matters for hiring, and for teams that already build with React on the web. Components, hooks and state management work the same way in React Native, and JavaScript-only npm packages carry over. Web and mobile developers can share business logic and types too.
Partiful, the event planning app, is a good example. It started as a web app, and its React and TypeScript team chose Expo over Ionic, native Swift and Flutter when it built its mobile apps.
Flutter asks your team to learn Dart, but Dart comes easily to anyone who knows TypeScript, Java or Kotlin. In return, the language, framework and tooling all come from one team at Google and were designed to work together.
Both give you a fast feedback loop while you code:
- Flutter’s stateful hot reload injects changed code into the running app and keeps its state, on mobile and on the web. Widget Previews, stable since Flutter 3.47, render individual widgets on their own while you edit them.
- React Native’s Fast Refresh shows most edits within a second or two and keeps the state of function components. It’s on by default in every Expo project.
Native code is within reach in both. Flutter talks to Swift, Kotlin and other platform code through platform channels, while Expo’s Modules API lets you write native modules and views in Swift and Kotlin, connected to JavaScript through JSI.
Building, Releasing and Updating Your App
Expo’s cloud services are the clearest practical difference between Flutter and Expo. EAS Build compiles your iOS and Android apps on Expo’s servers, EAS Submit uploads them to App Store Connect and Google Play and EAS Workflows automates the release from end to end.
That means a team can ship an iPhone app without setting up Xcode, certificates and provisioning profiles on its own machines. incident.io, the incident management company, says Expo lets its team get away with never installing Xcode or Android Studio at all.
Flutter leaves builds and releases to you. You build with the Flutter command-line tool, which needs Xcode on a Mac for iOS, and automate releases with your own CI pipeline or a third-party service.
Can You Update an App Without App Store Review?
An Expo app can update its JavaScript, styling and images over the air with EAS Update, without a new app store release. Changes to native code, permissions or the Expo SDK version still need a new build.
New York’s MTA built its TrainTime app for Metro-North and Long Island Rail Road riders with Expo, and uses EAS Update for hotfixes to core flows like trip planning and ticket purchasing. Its team says it can deploy a fix in under 90 seconds from the first user report.
Flutter has no built-in equivalent. Shorebird, a third-party service, adds code push to Flutter apps.
Store rules still apply either way. Apple’s Guideline 2.5.2 bars apps from downloading code that introduces or changes features, so keep over-the-air updates for fixes and small changes, and ship new features through the stores.
How Much Does Expo Cost?
Expo, React Native and Flutter are all free and open source. You only pay if you use Expo’s cloud services, and even those have a free plan.
| EAS plan | Price | Builds | Over-the-air updates |
|---|---|---|---|
| Free | $0 | 15 Android and 15 iOS builds a month, in a low-priority queue | Up to 1,000 monthly active users |
| Starter | $19 a month plus usage | $45 of build credit, high-priority queue | Up to 3,000 monthly active users |
| Production | $199 a month plus usage | $225 of build credit | Up to 50,000 monthly active users |
| Enterprise | Custom | From $1,000 of build credit | Volume pricing |
Building on your own machines with Expo costs nothing, so EAS is a convenience rather than a requirement. Flutter has no paid tier of its own: what you pay for there is your CI and any third-party services you add.
Can Flutter and Expo Build for the Web and Desktop?
Flutter targets more platforms than Expo. Alongside iOS and Android, it builds for the web, Windows, macOS and Linux from the same code, and its showcase reaches beyond phones: Toyota uses Flutter for infotainment systems, and LG for its webOS platform.
On the web, Flutter compiles to JavaScript or WebAssembly and draws the page the way it draws an app. Flutter’s own docs say it suits complex, interactive web apps, but that text-heavy, document-style content like blog articles is better served by the regular web.
Expo builds for iOS, Android and the web. Its web support runs on React Native for Web and React DOM, and pages can be statically rendered for search and speed. Expo SDK 58 also made server-side rendering, data loaders and middleware in Expo Router stable.
That makes Expo the better fit when the same codebase should also power a website people find through search. Desktop isn’t Expo’s focus: it relies on Microsoft’s React Native for macOS, and SDK 58 doesn’t support macOS until that project catches up.
Apps Built with Flutter and Expo
Flutter and Expo both run apps with millions of users, from Google’s own products to New York’s commuter rail apps.
Built with Flutter, according to Flutter’s showcase:
- Google Pay, Google Earth and NotebookLM, among Google’s own apps. Google built and shipped the NotebookLM app in seven months.
- Nubank, SoFi and Betterment, in banking and investing
- Headspace, Wolt and Universal Studios, in consumer apps
- Toyota and LG, in cars and TVs
Built with Expo, according to Expo’s customer stories:
- The MTA’s TrainTime app, built with Expo in 2022
- Partiful, the event planning app, and incident.io, the incident management platform
- Cameo, Mollie and Hipcamp, in consumer, payments and travel apps
React Native also powers Microsoft Office, Outlook and Teams, Amazon Shopping and every one of Shopify’s mobile apps, according to React Native’s showcase, although not all of them use Expo.
Flutter or Expo: Which Should You Choose?
Choose Expo over Flutter if your team knows React or TypeScript, or if fast releases and over-the-air fixes matter most. Choose Flutter if your app’s design is its selling point, or if you need desktop or embedded screens as well as phones.
| If you… | Use | Because |
|---|---|---|
| Have developers who already write React or TypeScript | Expo | Same language, components and hooks, with logic and types shared with your web app |
| Want an app that looks identical everywhere, with custom animation | Flutter | It draws every pixel itself |
| Need to ship fixes between store releases | Expo | EAS Update is part of the toolchain |
| Need Windows, macOS, Linux or embedded screens too | Flutter | Stable desktop support, and it already runs in cars and TVs |
| Want the same code to power a website that ranks in search | Expo | Static and server rendering on the web |
| Would rather not manage Xcode, signing and store uploads | Expo | EAS Build and EAS Submit handle them in the cloud |
| Want language, framework and tools from one team | Flutter | Google builds Dart, Flutter and its tooling together |
Expo is best suited to product teams with web roots, startups that need to move fast and companies that want one JavaScript skill set across web and mobile. Flutter is a strong fit for design-led consumer apps, teams happy to learn Dart and products that run on more than phones.
Compared with the gap between either one and building two separate native apps, the gap between Flutter and Expo is small. For most business apps, the skills your team already has should decide it.
When You Already Have a Website
Flutter and Expo are built for teams creating a new app from the ground up. If you already have a website or online store that customers use every day, building the app in either one means rebuilding your catalog, checkout, accounts and integrations in a second codebase, then keeping the two in step for as long as you have an app.
MobiLoud transforms your website into a custom native app, powered by the same underlying code as your website. We build the app from your site’s code, so it launches with your products, menus, content and features like search, loyalty and subscriptions already in place.
Then we design a fully custom, native interface for the phone and add what only an app can do: push notifications, app-only pages your team builds in your own platform, native features, SDKs and device integrations. Our team builds, launches and looks after your app - you’ll typically go live in 2 to 4 weeks.
We’ve helped brands like John Varvatos, Jack & Jones and Tadashi Shoji launch their apps this way. If your app is a new product with no website behind it, Flutter or Expo is the right tool.
Final Thoughts
Flutter vs Expo is really Flutter against React Native built with Expo, and both are mature, production-proven ways to build one app for iOS and Android. Flutter gives you a self-contained stack that draws every pixel and reaches desktop and embedded screens. Expo gives you React, native components and cloud services that make building, shipping and fixing an app faster.
Neither is the wrong choice for a capable team, so let your team and your app decide. If your developers write React, start with Expo. If your app’s look is the product, or it has to run beyond phones, start with Flutter.