Mobile App Development — Beginner Guide
Learn Flutter from zero: Dart basics, widgets, layouts, input, navigation, and build your first real app.
What Is Mobile App Development?
15 minMobile app development is the process of creating software for smartphones and tablets. This lesson gives you the full picture before you write a single line of code.
What you'll learn
- Understand what mobile app development really means
- Learn the difference between mobile and web apps
- Know the full development lifecycle
Concept
A mobile app is software built specifically for a phone or tablet operating system, mainly Android or iOS. Unlike websites, apps are installed on the device and can use hardware features like the camera, GPS, and sensors directly. Development involves designing the user interface, writing the app logic, and connecting to device features and remote services.
How it works
First you design what the user sees and how they navigate. Then you write the logic that responds to their actions. Finally you package the app into an installable file (APK for Android, IPA for iOS) and distribute it through app stores or directly.
Example
Understand it
The key idea is that a mobile app runs on the device itself, not inside a browser. This gives it direct access to hardware and offline capability, but it also means you must build separately for each platform or use a cross-platform tool.
Practice
List three apps you use daily and note one hardware feature each one uses.
Native vs Cross-Platform Development
15 minThere are two main ways to build mobile apps: native (one platform at a time) or cross-platform (both from one codebase). Choosing wisely saves months of work.
What you'll learn
- Understand native development
- Understand cross-platform development
- Compare the trade-offs of both approaches
Concept
Native development means building separately for Android (Kotlin/Java) and iOS (Swift). Cross-platform tools like Flutter and React Native let you write one codebase in Dart or JavaScript and compile it for both platforms. Cross-platform is usually faster and cheaper, while native gives the highest performance and most direct platform access.
How it works
A cross-platform framework provides its own rendering engine and widgets. Flutter, for example, draws every pixel itself using Skia, so the same UI looks identical on Android and iOS without relying on native components.
Example
Understand it
Cross-platform does not mean lower quality — modern tools like Flutter are extremely fast. The real difference is in edge cases, very platform-specific features, and large-team flexibility.
Practice
For a simple to-do app built by a solo beginner, which approach would you choose and why?
Why Flutter?
15 minFlutter is Google's open-source framework for building beautiful, fast mobile apps from a single codebase. This lesson explains why it has become so popular.
What you'll learn
- Learn Flutter's key strengths
- Understand the Dart language connection
- Know what kinds of apps Flutter suits best
Concept
Flutter uses the Dart language and compiles directly to native machine code, giving high performance without a JavaScript bridge. Its biggest strength is a rich set of pre-built widgets that make beautiful UIs easy to build, plus hot reload that lets you see changes instantly while coding.
How it works
You write Dart code that describes widgets. Flutter's engine renders those widgets directly on screen using Skia, so there is no lag from translating between JavaScript and native code.
Example
Understand it
Hot reload is the killer feature — it keeps you in the flow because you see results immediately instead of waiting for a full rebuild each time.
Practice
Name two features of Flutter that make it good for beginners.
Installing Flutter & Setting Up the Environment
25 minBefore writing code, you need the Flutter SDK, an editor, and an emulator or real device. This lesson walks through the setup step by step.
What you'll learn
- Install the Flutter SDK
- Set up an editor (VS Code or Android Studio)
- Run flutter doctor to verify the setup
Concept
Flutter provides a single SDK that includes the framework, Dart, and tools for building and testing. You also need a code editor and either an Android emulator, iOS simulator, or a physical device to run your app.
How it works
Download the Flutter SDK for your operating system and add it to your PATH. Then install Android Studio (for the Android emulator) or Xcode (for iOS on Mac). Finally run 'flutter doctor' — it checks every dependency and tells you exactly what is missing.
Example
Understand it
flutter doctor is your safety net. If anything is missing or misconfigured, it tells you the exact fix — never skip this step.
Practice
Run 'flutter doctor' and list any issues it reports.
Flutter Project Structure
20 minA Flutter project is more than just code — it has a specific folder layout that keeps platform files, assets, and your Dart code organised.
What you'll learn
- Understand the key folders in a Flutter project
- Know what lib/main.dart is for
- Learn what pubspec.yaml controls
Concept
The most important folder is lib/, where all your Dart code lives. main.dart is the entry point. The pubspec.yaml file declares your app's dependencies, assets, and metadata. The android/ and ios/ folders contain platform-specific configuration that Flutter manages for you.
How it works
When you run 'flutter create', it generates the full structure. You spend almost all your time inside lib/ and pubspec.yaml. The platform folders are usually left alone unless you add native plugins or custom settings.
Example
Understand it
You do not need to understand android/ and ios/ internals as a beginner. Focus on lib/ for code and pubspec.yaml for dependencies.
Practice
Create a new Flutter project and identify the three most important files or folders.
Your First Flutter App
25 minTime to write real code. This lesson replaces the default counter app with a simple, friendly welcome screen.
What you'll learn
- Understand the basic structure of a Flutter app
- Create a simple screen with text
- Run the app and see the result
Concept
Every Flutter app starts in the main() function, which calls runApp(). The runApp() function takes a root widget — usually a MaterialApp — and displays it. MaterialApp provides Material Design styling and a home screen.
How it works
main() launches the app. runApp(MyApp()) tells Flutter 'this is the root widget'. MyApp returns MaterialApp, and home points to a Scaffold, which gives you a basic page with a body.
Example
Understand it
runApp() takes your top widget. MaterialApp gives Material theming. Scaffold is the page skeleton. Center places the Text in the middle of the screen.
Practice
Change the default app's title and body text to your own name.
Dart Basics for Flutter
20 minDart is the language behind Flutter. This lesson introduces the essential syntax you will use in every single Flutter file.
What you'll learn
- Understand Dart's role in Flutter
- Learn basic syntax and structure
- Know the most common Dart concepts
Concept
Dart is an object-oriented, statically typed language that is easy to learn if you have used JavaScript, Java, or Python. In Flutter you will constantly write classes, functions, and expressions in Dart. Everything in Flutter — even a button or a text label — is an object.
How it works
A Dart file starts with imports, then defines functions and classes. Statements end with semicolons. Types are declared before variable names, like 'int count = 0;'.
Example
Understand it
The dollar sign inside a string ('$name') is string interpolation — it inserts the variable value directly into the text.
Practice
Write a Dart function that takes a number and prints 'The number is X'.
Variables, Data Types & Operators
20 minEvery program stores and manipulates data. This lesson covers Dart's core data types and the operators you will use constantly.
What you'll learn
- Learn Dart's basic data types
- Understand variable declaration
- Use arithmetic and comparison operators
Concept
Dart has numbers (int, double), strings (String), booleans (bool), lists (List), and maps (Map). Variables can be declared with an explicit type, or with 'var' and 'final' for type inference and immutability.
How it works
'int age = 20;' declares an integer. 'final name = 'Ali';' creates an unchangeable string. Operators like +, -, *, / do math, and ==, !=, >, < compare values.
Example
Understand it
int division '/' always returns a double in Dart. Use '~/' for integer division if you need a whole number result.
Practice
Create two numbers, add them, and print whether the result is greater than 20.
Conditions & Loops
20 minApps make decisions and repeat actions. This lesson teaches Dart's if/else conditions and for/while loops.
What you'll learn
- Use if/else for decisions
- Use for and while loops
- Understand when to use each loop type
Concept
Conditions let code choose different paths — if a user is logged in, show their profile; otherwise show a login button. Loops repeat code — a for loop iterates a known number of times, while a while loop repeats until a condition becomes false.
How it works
'if (condition) { ... } else { ... }' branches the code. 'for (var i = 0; i < 5; i++)' runs five times. 'while (condition)' keeps running until the condition is false.
Example
Understand it
The modulo operator '%' gives the remainder after division. i % 2 == 0 means the number is even.
Practice
Print numbers from 1 to 10, but for multiples of 3 print 'Fizz' instead.
Functions & Parameters
20 minFunctions are reusable blocks of code. In Flutter, almost everything you build is expressed as a function or a widget build method.
What you'll learn
- Define and call functions
- Use parameters and return values
- Understand named and optional parameters
Concept
A function takes inputs (parameters), does work, and optionally returns a result. Dart supports positional parameters, named parameters, and default values. This flexibility appears everywhere in Flutter widget constructors.
How it works
'int add(int a, int b) => a + b;' is a shorthand function that returns the sum. Named parameters use curly braces: 'void greet({required String name}) { ... }'.
Example
Understand it
Named parameters with 'required' must be provided; those with a default value are optional. This is how Flutter widgets take dozens of optional settings.
Practice
Write a function that takes a first and last name and returns the full name.
Understanding Widgets
20 minIn Flutter, everything is a widget. This is the single most important idea in the entire framework, and this lesson explains what it means.
What you'll learn
- Understand the widget concept
- Learn how widgets compose into a UI
- Know that widgets are immutable
Concept
A widget is a description of what part of the UI should look like. Text, Button, Row, Column, and even the whole app are widgets. You build a screen by nesting widgets inside each other to form a widget tree.
How it works
Each widget has a build() method that returns another widget. The root MaterialApp builds a Scaffold, which builds a Column, which builds Text widgets — a tree from root to leaf.
Example
Understand it
The Column widget is the parent; the Text and Icon widgets are its children. Flutter renders the tree from top to bottom.
Practice
Name five widgets you have already seen in the lessons so far.
Stateless vs Stateful Widgets
25 minThere are two kinds of widgets in Flutter: stateless and stateful. Knowing the difference is essential to building responsive apps.
What you'll learn
- Understand stateless widgets
- Understand stateful widgets
- Know when to use each
Concept
A stateless widget never changes after it is built — a static label or icon is a good example. A stateful widget can change over time — a counter or a form input needs state because the UI must update when the data changes.
How it works
A stateless widget only has a build() method. A stateful widget has two parts: the widget itself and a State object that holds mutable data. Calling setState() tells Flutter to rebuild that widget with new data.
Example
Understand it
Stateless widgets are simpler and faster. Use them unless the widget's own data changes; in that case use a stateful widget.
Practice
Decide whether a profile picture and a like button should be stateless or stateful.
Text, Icons, Images & Buttons
25 minThese are the building blocks of almost every screen. This lesson teaches Flutter's most common visible widgets.
What you'll learn
- Display text with styling
- Use icons and images
- Create buttons that respond to taps
Concept
Text shows a string with optional style. Icon displays a Material icon. Image loads graphics from assets or the network. Buttons like ElevatedButton, TextButton, and IconButton trigger actions when pressed.
How it works
Each widget takes parameters: Text takes a string and style, Icon takes an IconData, Image.asset/network loads images, and buttons take a child and an onPressed callback.
Example
Understand it
The onPressed callback runs when the button is tapped. If onPressed is null, the button is disabled.
Practice
Build a screen with a title, an icon, and a button that prints a message.
Rows, Columns & Containers
25 minLayout is how you arrange widgets on screen. Rows, Columns, and Containers are the three most important layout tools.
What you'll learn
- Arrange widgets horizontally with Row
- Arrange widgets vertically with Column
- Use Container for size, padding, and decoration
Concept
Row places children side by side. Column stacks children top to bottom. Container wraps a single child and adds padding, margin, size, color, and border. Combining these three lets you build almost any screen.
How it works
Row and Column take a children list. Container takes one child and styling properties. Nesting them creates complex layouts — a Column of Rows is the classic grid-like pattern.
Example
Understand it
SizedBox creates fixed spacing. mainAxisAlignment controls how children are distributed along the main axis (horizontal for Row, vertical for Column).
Practice
Create a screen with two texts side by side and one text below them.
Padding, Margin & Alignment
20 minWhitespace and positioning make a UI feel polished. This lesson covers Flutter's spacing and alignment tools.
What you'll learn
- Add padding inside a widget
- Add margin around a widget
- Align and center content precisely
Concept
Padding is space inside a widget's border; margin is space outside it. Container accepts both padding and margin. Alignment controls where a child sits inside its parent — Center places it in the middle, Align lets you pick any corner or edge.
How it works
EdgeInsets.all(16) gives equal space on all sides; EdgeInsets.symmetric adds different vertical/horizontal values. Alignment values like topLeft, center, and bottomRight position a child within available space.
Example
Understand it
Margin pushes the container away from siblings; padding pushes the child away from the container edges; Align controls the child's position in remaining space.
Practice
Center a box with 30px margin and 15px padding containing the text 'Hello'.
Lists & ListView
25 minAlmost every app shows a list of items — messages, posts, products. ListView is Flutter's scrollable list widget.
What you'll learn
- Understand List basics in Dart
- Build scrollable lists with ListView
- Render lists dynamically with ListView.builder
Concept
A Dart List holds an ordered collection of values. ListView renders a scrollable list of widgets. For small fixed lists you can pass children directly; for long or dynamic lists, ListView.builder creates items on demand, which is much more efficient.
How it works
ListView(children: [...]) builds everything at once. ListView.builder(itemCount: n, itemBuilder: (context, i) => ...) lazily builds only the visible items as you scroll.
Example
Understand it
The itemBuilder receives an index and returns a widget for that position. Only visible items are built, so a list of 10,000 items stays fast.
Practice
Render a ListView with five items, each showing 'Item 1' through 'Item 5'.
User Input & Text Fields
25 minUsers give input through text fields, switches, and sliders. This lesson focuses on the most common one — TextField.
What you'll learn
- Collect text input with TextField
- Use a controller to read input
- Handle form input correctly
Concept
TextField lets users type text. A TextEditingController holds the current value. You attach the controller to the field, then read controller.text whenever you need the input. TextField also has onChanged, which fires every time the text changes.
How it works
Create a controller, pass it to the TextField, and read controller.text in a button's onPressed. Don't forget to dispose the controller to free resources.
Example
Understand it
The controller is the bridge between the UI and your logic. Reading controller.text gives the latest value without needing to track every keystroke.
Practice
Create a text field and a button; when the button is pressed, print the text field's contents.
Navigation Between Screens
25 minReal apps have multiple screens. This lesson teaches how to move between them and pass data along.
What you'll learn
- Push a new screen
- Pop back to the previous screen
- Pass data between screens
Concept
Flutter uses a Navigator to manage a stack of screens. Navigator.push() adds a new screen on top; Navigator.pop() removes it and returns to the previous one. You can pass data to the new screen through its constructor.
How it works
Define a route with MaterialPageRoute that builds the next screen. Call Navigator.push(context, MaterialPageRoute(builder: (context) => SecondScreen())) to open it, and Navigator.pop(context) to go back.
Example
Understand it
push adds a screen to the stack; pop removes it. The constructor parameter 'name' is how you pass data to the next screen.
Practice
Create two screens; a button on the first opens the second, and the second has a back button.
Basic State & UI Updates
25 minNow we bring it together: state that changes the UI. This lesson explains setState, the simplest way to update a screen.
What you'll learn
- Understand state in Flutter
- Update UI with setState
- Build a simple interactive counter
Concept
State is any data that can change and affect the UI. In a StatefulWidget, you store state in the State object and call setState() to rebuild the UI when that data changes. setState tells Flutter 'the data changed, redraw the screen'.
How it works
Declare a mutable variable in the State class. In a button's onPressed, update the variable and wrap the change in setState(() { ... }). Flutter then rebuilds the widget with the new value.
Example
Understand it
Without setState, the variable changes but the UI does not redraw. setState is the signal that triggers the rebuild.
Practice
Add a second button that decreases the counter, but never lets it go below zero.
Mini Project — To-Do / Counter App
40 minTime to combine everything. This final lesson guides you through building a simple, complete app with input, lists, state, and navigation.
What you'll learn
- Combine widgets, state, and input
- Build a functional to-do list
- Understand the complete app structure
Concept
A to-do app needs: a text field to type tasks, a button to add them, a list to display them, and state to hold the tasks. This ties together TextField, ListView, setState, and basic layout — everything from the previous nineteen lessons.
How it works
Maintain a List<String> of tasks in the State. On button press, read the text field, add the task to the list, clear the field, and call setState. Render the list with ListView.builder. Optionally add a delete button to each row.
Example
Understand it
The list holds data, setState refreshes it, ListView.builder renders it, and the controller reads input. Each piece maps to a lesson you have already learned.
Practice
Extend the to-do app by adding a delete icon next to each task.
You have completed all 20 beginner lessons.
Move on to Intermediate for APIs, state management, and real-world apps.
Continue to Intermediate