Mobile App Development
ConceptBeginner 20 min· Ship it · 9 of 12

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

AspectReact Native (Expo)Flutter
LanguageJavaScript or TypeScriptDart
UI approachUses the platform's native componentsDraws its own widgets with its own engine
MakerMeta, with a large community; Expo is a separate company's toolkitGoogle
Web developer fitVery high: same React ideasLower: new language and widget system
Look across devicesFollows each platform's lookIdentical everywhere unless you adapt it
Hot reloadYes (Fast Refresh)Yes (stateful hot reload)
Tooling for beginnersExpo Go: test on a phone with no setupNeeds Flutter SDK and Android Studio or Xcode set up
Code sharing with a websiteCan share logic and some code with React webPossible with Flutter web, but a separate world from HTML/CSS
Librariesnpm: huge, but quality variespub.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.

Counter.tsx (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.

lib/main.dart (Flutter, Dart)
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 NativeFlutter
ComponentWidget
useStateStatefulWidget with setState, or state packages such as Provider or Riverpod
<View> with flexboxColumn, Row, Stack, Container
FlatListListView.builder
StyleSheetWidget properties and ThemeData
Expo Router / React NavigationNavigator, or packages such as go_router
npmpub.dev and pubspec.yaml
npx expo startflutter 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 ReactReact Native with Expo
You want to share code with a React websiteReact Native
You want pixel-identical, heavily custom, animation-rich UIFlutter
You are starting from zero and want one clean frameworkEither; pick the one whose jobs you want
You need deep platform features (advanced camera, widgets, wearables), top performanceNative, or cross-platform with native modules
Your app is mostly content in a web formatA 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

  1. "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.
  2. "Flutter will replace React Native" (or the reverse). Both are used widely and maintained actively. Don't bet your career on rumours.
  3. "You never need native code." Sometimes you do, for special hardware or new OS features.
  4. "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

  1. Flutter draws its own UI with Dart; React Native drives the platform's real native components with JavaScript.
  2. The core ideas (components or widgets, state, navigation, lists, storage) are the same in both.
  3. React Native suits JavaScript and React developers and code sharing with web; Flutter suits custom, uniform, animation-rich UI.
  4. Native (Kotlin or Swift) gives the most control and costs two codebases.
  5. Choose by team skills, app needs and local job demand, not by hype.
  6. 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.

Start free