Interactive roadmap
Flutter roadmap
For absolute beginners wanting to build mobile apps. You will learn how to design layouts and write working apps for iOS and Android.
- 1
Dart Basics
0 of 4 done
Learn the programming language behind Flutter.
Take your time with Dart basics, as a strong foundation makes building actual mobile screens much easier later on. - 2
Widgets and Layouts
0 of 4 done
Build your visual user interface using pre-made blocks.
Experiment with changing widget properties on your phone emulator to see instant visual updates. - 3
State and Navigation
0 of 4 done
Manage data flow and move between different screens.
Keep your screen navigation simple at first, making sure users can always find their way back home. - 4
Networking and Storage
0 of 3 done
Connect to the internet and save data locally.
Always handle network errors gracefully so your app shows a helpful message instead of freezing. - 5
Testing and Publishing
0 of 3 done
Check your code works and release your app to the world.
Test your app on a physical phone before publishing to catch any touch target or layout issues.
Learn it all, with a tutor that never sleeps
Every topic links to LevelUp lessons, practice exercises and the 24/7 AI Tutor. Your progress updates as you master lessons.
Every topic explained
Step 1: Dart Basics
- Store text, numbers, and truth values in your code. This is how your app remembers information.Dart Documentation
Read more
Variables act like labelled storage boxes in your computer memory where your program can keep pieces of information. Data types tell Dart whether that box holds text, a whole number, a decimal, or a simple yes-or-no truth value.
Imagine a shopping app that needs to remember a user name as text and an item count as a number. You declare a variable to hold the quantity, and update it whenever the user adds another item to their basket.
Learning how to store data properly is vital because every mobile app needs to remember user inputs, settings, and scores while running.
- Variables store data in memory for later use
- Types include text, numbers, and booleans
- Dart uses explicit or inferred type definitions
- Values inside variables can change over time
- Use if statements and loops to make decisions in your app code.
Read more
Control flow allows your program to make decisions and repeat tasks automatically based on changing conditions. Instead of running every line in a straight sequence, your app can choose different paths.
Consider a weather app checking if the temperature drops below zero. If it does, the code runs an instruction to display a snow alert banner on the screen.
Mastering control flow matters because real apps must respond dynamically to user choices, network states, and device settings.
- If and else statements handle conditional logic
- Loops repeat blocks of code efficiently
- Boolean expressions evaluate to true or false
- Logical operators combine multiple conditions
- Group blocks of reusable code together to keep your project tidy.
Read more
Functions are self-contained blocks of reusable code designed to perform a specific job. They help break large problems into smaller, manageable pieces.
Think of calculating the total price of items in a cart including tax. Instead of writing the math on every screen, you write a function once and call it whenever checkout runs.
Clean functions keep your codebase tidy, prevent code duplication, and make debugging much simpler as your application grows.
- Functions group reusable logic into blocks
- They can accept inputs called parameters
- Functions can return a computed result
- Keep functions small and focused on one task
- (optional)
- Create classes and objects to model real-world things in your app.
Read more
Object orientation lets you group related data and behaviours into blueprints called classes, then create individual instances called objects from them.
Imagine building a music player app. You define a song class with properties like title and artist, and methods like play and pause, then create objects for each track.
Object orientation is essential in Flutter because the entire user interface framework is built around classes and objects working together.
- Classes act as blueprints for creating objects
- Objects combine data properties and methods
- Encapsulation keeps internal data safe
- Inheritance allows sharing behaviour between classes
Step 2: Widgets and Layouts
- Display static visual elements that do not change over time.Flutter Documentation
Read more
Stateless widgets are the building blocks for static parts of your user interface that never change once they appear on screen. They do not store any mutable data.
Think of a standard settings menu header title or a static profile picture frame. Once drawn, their appearance remains fixed until you restart or navigate away.
Knowing how to use stateless widgets is crucial because they form the lightweight skeleton of your app layout without wasting memory.
- Stateless widgets cannot change after creation
- They rely entirely on passed configuration data
- Ideal for static text, icons, and layout containers
- Extends the base StatelessWidget class
- Arrange items side by side or stacked vertically on screen.
Read more
Rows and columns are layout widgets that arrange other visual components horizontally or vertically across the available screen space.
Imagine a social media post card where the user avatar sits in a row beside the username, while the description and image sit stacked below in a column.
Understanding how to combine rows and columns is fundamental to building responsive layouts that fit different phone screen sizes.
- Rows arrange child widgets horizontally
- Columns arrange child widgets vertically
- Expanded and flexible widgets handle overflow
- MainAxisAlignment controls spacing alignment
- Build interactive parts of your app that change when tapped or typed into.
Read more
Stateful widgets manage interactive user interface elements that update and redraw when data changes during runtime.
Think of a like button on a photo post. When tapped, the icon turns red and the counter increases by one instantly on screen.
Stateful widgets matter because modern apps must feel alive, responsive, and interactive to keep users engaged.
- Stateful widgets maintain a mutable state object
- Calling setState triggers a visual screen redraw
- Used for checkboxes, counters, and toggles
- Combines widget configuration with state logic
- (optional)
- Add colours, custom fonts, and images to make your app look great.
Read more
Styling and assets give your app its unique visual brand through custom colours, typography, and local image files.
Imagine a food delivery app using warm brand colours, custom header fonts, and high-resolution meal photos to make food look appetising.
Good styling transforms a plain prototype into a polished, professional product that users enjoy looking at every day.
- TextStyle customises font size, weight, and colour
- ThemeData sets consistent styles across screens
- Images are declared in pubspec yaml files
- Assets provide offline visual branding
Step 3: State and Navigation
- Push and pop routes so users can travel across different pages.
Read more
Screen navigation manages how users move between different pages in your mobile application using a stack system.
Think of opening a settings menu from your home feed. The settings page pushes on top of the stack, and pressing back pops it off to reveal the home feed again.
Proper navigation is essential for structuring multi-page apps without confusing your users or causing memory leaks.
- Navigator push adds a new screen route
- Navigator pop returns to the previous screen
- Named routes help organise complex apps
- Passing data between screens is supported
- Collect user input safely with text fields and validation checks.
Read more
Forms and text fields allow users to type information, submit login credentials, or update their personal profile details.
Imagine a sign-up screen where the user enters their email address and password, and the form checks that the email format is correct before submitting.
Validation prevents bad data from entering your system and gives immediate helpful feedback to the user.
- TextFormField captures typed user input
- Validators check rules like minimum length
- Global keys manage form submission states
- Keyboard types adapt to input requirements
- Share data cleanly across multiple screens without messy code.
Read more
State management techniques help share and synchronise app data across multiple independent screens without writing messy code.
Imagine a shopping cart where adding an item on the catalogue screen instantly updates the badge count on the checkout tab.
Clean state management keeps your project maintainable as it grows from a single screen into a large, feature-rich application.
- Lifting state up shares data with parents
- Inherited widgets pass data down trees
- Simple packages like Provider help organise state
- Prevents messy prop drilling through widgets
- (optional)
- Display long collections of items smoothly using builder views.
Read more
Lists and grids display collections of items smoothly, loading only the visible elements to save memory.
Think of a photo gallery app showing hundreds of pictures in a scrollable grid or an inbox showing email summaries.
Using builder constructors ensures your app remains fast and responsive even when loading thousands of items.
- ListView builder renders items on demand
- GridView creates structured multi-column layouts
- Item builders recycle views for performance
- Supports both vertical and horizontal scrolling
Step 4: Networking and Storage
- Download live information from web servers using HTTP requests.
Read more
Fetching API data allows your mobile app to download live information from web servers using HTTP requests.
Imagine a weather app asking a remote server for the latest forecast temperature and displaying it on your screen.
Connecting to APIs is vital for building real-world apps that display current news, social feeds, and user profiles.
- Http package handles network requests
- Async and await manage delayed responses
- JSON data is decoded into Dart objects
- Loading spinners show waiting states
- Save user preferences and small bits of data directly on the device.
Read more
Local storage saves small preferences and settings directly on the device so data persists even when the app closes.
Imagine a dark mode toggle that remembers your preference so the app stays dark the next time you open it.
Local storage ensures a personalised user experience without requiring an internet connection every time.
- SharedPreferences stores simple key-value pairs
- Data persists across app restarts
- Useful for login tokens and settings
- Asynchronous read and write operations
- (optional)
- Catch network failures gracefully so your app does not crash.
Read more
Error handling catches network failures, timeouts, and invalid data gracefully so your app never crashes unexpectedly.
Imagine your internet drops while loading a profile page; instead of freezing, the app catches the error and displays a retry button.
Robust error handling is crucial for maintaining a professional user experience in unstable mobile network conditions.
- Try and catch blocks isolate risky code
- Timeout exceptions handle slow servers
- Fallback UIs display friendly error messages
- Logging aids in debugging production bugs
Step 5: Testing and Publishing
- Write automated checks to ensure your user interface behaves correctly.
Read more
Widget testing involves writing automated code checks to confirm your user interface looks and behaves correctly.
Imagine verifying that tapping a login button triggers the loading spinner without opening your entire backend server.
Automated tests save time and prevent accidental bugs from breaking your screens when you update code.
- TestWidgets function simulates user interactions
- Finders locate specific elements on screen
- Expect statements verify expected UI states
- Runs quickly without a physical device
- Add professional loading screens and app store icons.
Read more
Icons and splash screens give your app a polished first impression with custom branding and loading screens.
Imagine a user tapping your app icon on their home screen and seeing a smooth branded splash animation while data loads.
Professional icons and startup screens are essential for making your app look legitimate in app stores.
- App icons use specific sizing for iOS and Android
- Splash screens bridge the app startup delay
- Generator tools automate asset resizing
- Manifest files configure launcher settings
- Build production releases and upload them to app stores.
Read more
Publishing apps involves building production release bundles and uploading them to the Google Play Store and Apple App Store.
Imagine finishing your app, signing it with release keys, and submitting it for public review so anyone can download it.
This final step brings your hard work to real users around the world.
- Release builds optimise code performance
- App signing secures your publisher identity
- Store listings require screenshots and descriptions
- Review guidelines must be followed