Flutter in one lesson: how it compares
See what Flutter is, how it renders differently from React Native, how the same screen looks in both, and how to choose between Flutter, React Native and fully native for a real project.
You are learning React Native with Expo, but you will hear about Flutter in every mobile conversation, and interviewers like to ask how they compare. This lesson gives you enough Flutter to read it, compare it fairly, and choose between the two for a project. It does not teach Flutter fully.
What Flutter is
Flutter is Google's toolkit for building apps for Android, iOS, web and desktop from one codebase. You write in the Dart language. Dart looks like a mix of Java and JavaScript, so it takes a few days to feel comfortable if you know either.
The main idea: Flutter does not use the phone's built-in buttons and text fields. It draws every pixel itself with its own rendering engine. So an app looks the same on every device and version, and animations are smooth.
React Native works differently: your JavaScript describes a UI, and React Native creates the phone's real native components (a real Android TextView, for example). The app feels native by default, and updates in the phone's design come along automatically.
Side by side
| Aspect | React Native (Expo) | Flutter |
|---|---|---|
| Language | JavaScript or TypeScript | Dart |
| UI approach | Uses the platform's native components | Draws its own widgets with its own engine |
| Maker | Meta, with a large community; Expo is a separate company's toolkit | |
| Web developer fit | Very high: same React ideas | Lower: new language and widget system |
| Look across devices | Follows each platform's look | Identical everywhere unless you adapt it |
| Hot reload | Yes (Fast Refresh) | Yes (stateful hot reload) |
| Tooling for beginners | Expo Go: test on a phone with no setup | Needs Flutter SDK and Android Studio or Xcode set up |
| Code sharing with a website | Can share logic and some code with React web | Possible with Flutter web, but a separate world from HTML/CSS |
| Libraries | npm: huge, but quality varies | pub.dev: smaller, often well maintained |
Check the exact current features and versions on each project's official site, as both change every few months.
The same screen in both
Here is a counter, the "hello world" of mobile. First React Native.
import { useState } from 'react';
import { Button, Text, View } from 'react-native';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text style={{ fontSize: 32 }}>{count}</Text>
<Button title="Add" onPress={() => setCount(count + 1)} />
</View>
);
}Now Flutter. A widget is anything on screen: a button, a text, a layout, even padding. Widgets are nested like JSX tags. A StatefulWidget holds data that can change, and setState tells Flutter to redraw.
import 'package:flutter/material.dart';
void main() => runApp(const MaterialApp(home: Counter()));
class Counter extends StatefulWidget {
const Counter({super.key});
@override
State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('$count', style: const TextStyle(fontSize: 32)),
ElevatedButton(
onPressed: () => setState(() => count++),
child: const Text('Add'),
),
],
),
),
);
}
}Same idea: state, a build function that describes the screen, and a call that triggers a redraw. Flutter is more verbose, and styling is done with widgets instead of a style object.
Mapping the ideas you already know
Translation table
| React Native | Flutter |
|---|---|
| Component | Widget |
useState | StatefulWidget with setState, or state packages such as Provider or Riverpod |
<View> with flexbox | Column, Row, Stack, Container |
FlatList | ListView.builder |
StyleSheet | Widget properties and ThemeData |
| Expo Router / React Navigation | Navigator, or packages such as go_router |
| npm | pub.dev and pubspec.yaml |
npx expo start | flutter run |
Native development
Native means building each platform separately with its own language and tools: Kotlin with Jetpack Compose for Android, Swift with SwiftUI for iOS. You get the best access to new platform features, the best performance control, and the most polished platform feel. The cost: two codebases and usually two skill sets.
Even in cross-platform apps, you sometimes write a little native code for a feature the framework lacks. React Native (through Expo modules) and Flutter (through platform channels and plugins) both allow this.
How to choose
Decision guide
| If... | Lean towards |
|---|---|
| You or your team know JavaScript and React | React Native with Expo |
| You want to share code with a React website | React Native |
| You want pixel-identical, heavily custom, animation-rich UI | Flutter |
| You are starting from zero and want one clean framework | Either; pick the one whose jobs you want |
| You need deep platform features (advanced camera, widgets, wearables), top performance | Native, or cross-platform with native modules |
| Your app is mostly content in a web format | A good responsive website or PWA may be enough |
There is no universal winner. Teams ship great apps with all three. For a learner, the most useful question is: which one do the jobs and companies around me ask for, and which one can I start building with this week? Look at current job posts in your city for "React Native" and "Flutter" to see local demand, rather than trusting any claim from an article.
Skills transfer
If you know React Native well, Flutter takes a few weeks to learn, because the mobile ideas (screens, state, navigation, lists, API calls, storage, builds) are the same. Spend your first months getting deep in one framework.
Common myths
Do not believe these
- "Cross-platform apps are always slow." Well-built ones are fast enough for most apps. Performance problems usually come from big lists, large images and heavy work on the main thread, in any framework.
- "Flutter will replace React Native" (or the reverse). Both are used widely and maintained actively. Don't bet your career on rumours.
- "You never need native code." Sometimes you do, for special hardware or new OS features.
- "Pick the framework with the most stars on GitHub." Pick by your team's skills, the app's needs and hiring.
How this comes up in interviews
Interviewers ask "Why React Native over Flutter (or native)?" They want reasoning, not loyalty. A good answer: "Our team knows JavaScript, we can share logic with the web app, Expo speeds up builds and updates, and our app is standard screens and lists. If we needed heavy custom graphics, I would look at Flutter, and for deep platform features I would write a native module." Also be ready to explain how each renders: native components vs own engine.
Try it: Compare with your own eyes
Pick one screen you built in this track (for example a list with a title and a button). Describe in a table how you would build it in Flutter: which widgets replace each React Native component. If you want to try Flutter, follow the install steps on flutter.dev and run flutter create hello_app, then flutter run.
Key takeaways
- Flutter draws its own UI with Dart; React Native drives the platform's real native components with JavaScript.
- The core ideas (components or widgets, state, navigation, lists, storage) are the same in both.
- React Native suits JavaScript and React developers and code sharing with web; Flutter suits custom, uniform, animation-rich UI.
- Native (Kotlin or Swift) gives the most control and costs two codebases.
- Choose by team skills, app needs and local job demand, not by hype.
- Learn one framework deeply first; the second is much faster to learn.
Check yourself
Finishing the quiz marks the lesson as done.
1. What is the main technical difference between Flutter and React Native?
2. Which language does Flutter use?
3. Your team is all React web developers and wants to share validation logic with the website. What is the most sensible choice?
4. In Flutter, which is the closest match to a React Native FlatList?
5. What is a good reason to choose fully native development?
Saved on this device. Create a free account to keep it on every device.
Practise this with Sam
A real mock interview, out loud, with an honest scorecard. Free to start.