*…in all the ways that don’t matter.
Flutter and React Native are natural competitors as two of the most used multi-platform mobile app frameworks. Debates swirl…developers argue…and, in the end, apps are shipped, using one or the other.
So which is better?
The smart answer, the one that senior engineers will say with a cheeky grin, is: “It depends. Both have pros and cons, and in the end it’s a decision about tradeoffs.”
But that’s hardly a satisfying answer. It’s like saying the best player in the NBA is “depends on their role”. That doesn’t spur talk show hype, drive clicks, and increase engagement!
So let’s cause some drama and ruffle some feathers, and talk about why Flutter is better than React Native…in all the ways that don’t matter.
We could talk about all the things that don’t really matter: performance, developer experience, Dart vs JavaScript, native integrations, standard libraries, and much, much more.
The title is provocative; I’ll give you that. But this article isn’t just click-bait! In fact, I am going to do a deeper dive into most of those things in a more nuanced way later in this article.
But let’s cut to the chase. What does matter?
The answer lies not in the technical aspects of React Native and Flutter at all. It is not even something that a mobile developer might care about.
But to the people making decisions on what to use for their next app, this is what matters right now:
Hiring
Hiring developers is famously difficult right now. Tech salaries are up and supply is limited. Finding qualified developers that want to work for your company is like pulling teeth.
Flutter developers are passionate and high quality — this is in no way throwing shade at the Flutter development community! They just aren’t … high quantity. It’s not like you have a gigantic pool of Dart developers to pull from. You’re always training, pretty much every hire.
React Native developers, on the other hand, have a vast pool to draw from, and that’s the JavaScript community. JavaScript (and its popular variant, TypeScript) is by far the most popular programming language in the world and still growing quickly. React.js, which powers React Native, is arguably one of the biggest (if not the biggest) coding framework in the world. It’s still difficult to hire, but the pool of developers to draw from is far larger than Flutter’s. Taking a React developer and making them into a reasonably productive React Native developer is a straightforward process.
Sharing Code, Knowledge, and Developers
While hiring is the biggest, most impactful part of the decision to use Flutter or React Native, there’s another very important one I should mention, and that is sharing code, knowledge, and developers.
What’s better than good code? Less code. And one of the best ways to have less code is to share code between multiple apps. It can reduce your initial development time and simplify maintenance long-term.
Chances are, your company is using React.js, or at least JavaScript, in its websites, web apps, servers, and more. Being able to share code between your React.js app, Node servers, and more is a huge superpower for React Native — and something that Flutter isn’t nearly as strong on.
Beyond sharing code, it’s also a massive advantage to be able to share knowledge between your web, backend, iOS, and Android teams. You can have common wikis, Slack channels, and more. And there are a ton of tutorials, blog articles, StackOverflow Q&A, and more about React Native, React, and JavaScript online.
You can also, of course, share actual developers between these projects, and be able to ramp up headcount on a critical project without having to re-train nearly as much.
In the end, it’s hard to see past these absolutely critical factors when making a choice between React Native and Flutter.
But…what about performance? What about developer experience? What about accessibility, third-party library ecosystem, and more?
In pretty much every case, Flutter and React Native are neck-and-neck. Flutter wins some battles, React Native wins others. In no specific technical area (other than sharing code with web, as described above) does one framework win conclusively.
That’s it. That’s the article. You can stop. You got the point.
Okay … why are you still reading?
What’s that? You want specifics? Details?
Gant Laborde tells me, when you stick the landing, stop running. When you make the sale, stop selling.
But I can’t help myself. I love talking shop.
Let’s dive in deeper.
Developer Experience
Flutter’s team (and Google in general) are pretty good at developer experience.
Setting up your environment for Flutter development is generally easier than React Native. Flutter’s hot reload usually works better than React Native’s fast refresh. They have some really nice tools for debugging, profiling, and inspecting your widget tree. Their built-in end-to-end testing is a lot better than React Native’s Detox. Flutter’s CLI is first-class — I really love their flutter doctor
command, for example, and you can manage your simulators and emulators right from the CLI.
Flutter has a better upgrading experience as well, as you can just run flutter create
in an existing app and it’ll recreate everything in the new version.
React Native’s tooling, on the other hand, has lacked a lot of the polish that Flutter’s tools have. React Native’s upgrading experience is one of the more painful aspects, as anyone who has worked with it for the past few years will attest.
It’s improving somewhat; in a recent React Native Radio episode (RNR 227), we talked with a couple of developers from Microsoft about the work they’re doing to improve React Native’s tooling and overall developer experience.
Additionally, Expo is designed to improve the developer experience tremendously in React Native, and with Expo Application Services you can now do just about anything in Expo that you could in vanilla React Native. Expo’s upgrading experience is excellent and their integrated tooling works very well. And if you’re not using custom native code, the Expo Go app is an amazing way to quickly share builds with others without compiling. Expo is a nontrivial advantage — if you’re using it!
TL;DR: Flutter’s developer experience is one of its strongest claims. React Native is catching up and has a ways to go — but Expo gives it a strong boost.
Performance
It’s difficult to compare performance in any software framework, much less something as complex as Flutter and React Native. Flutter and React Native are both “fast enough” for most situations, especially when a performance optimization pass has been done on them by competent developers.
Historically, though, Flutter’s out-of-the-box performance has been better than React Native’s. With that said, you can certainly write poorly performing Flutter apps along with very well-performing React Native apps.
The performance differences are mostly due to the asynchronous React Native bridge which will be replaced by concurrent communication between native and JS as the new architecture rolls out this spring. Additionally, the Hermes JS engine improves performance in a lot of key metrics. And lastly, Skia is now coming to React Native, which means you can have the same renderer for React Native that you would use in Flutter — but only where you need that sort of fluid canvas pe