Introduction
Introduction
What is Flutter?
Join our Online Learning Community
Understanding the Flutter Architecture
How Flutter & Dart Code Gets Compiled To Native Apps
Understanding Flutter Versions
Flutter macOS Setup
macOS Development Environment
Flutter Windows Setup
Windows Development Environment
Flutter & Material Design
Flutter Alternatives
Course Outline
How To Get The Most Out Of The Course
Useful Resources & Links
Flutter Basics [QUIZ APP]
Module Introduction
Creating a New Project
An Overview of the Generated Files & Folders
More on Git (Version Control System)
Analyzing the Default App
Dart Basics
More Dart Basics
Dart Basics - Summary
Dart Fundamentals
Building an App From Scratch
Running the App on an Emulator
Class Constructors & Named Arguments
First Summary & Additional Syntax
Flutter App Basics
Building a Widget Tree
Visible (Input / Output) & Invisible (Layout / Control) Widgets
Adding Layout Widgets
Widget Basics
Connecting Functions & Buttons
Anonymous Functions
Updating Widget Data (Or: Using StatelessWidget Incorrectly)
[DART DEEP DIVE] Understanding Lists
Updating Correctly with Stateful Widgets
Stateful & Stateless Widgets
A Brief Look Under The Hood
Using Private Properties
Creating a New, Custom Widget
First Styling & Layouting Steps
Enums & Multiple Constructors
Official Docs & The Widget Catalog
Passing Callback Functions Around
Introducing Maps
Mapping Lists to Widgets
final vs const
Advanced Flutter & Dart Basics
Introducing "if" Statements
[DART DEEP DIVE] More on "if" Statements
[DART DEEP DIVE] The "null" Value
Outputting Widgets Conditionally
Splitting the App Into Widgets
Calculating a Total Score
Getters & "else-if"
Resetting the Quiz
Wrap Up
Module Resources
Running Apps on Different Devices & Debugging Apps
Module Introduction
Running the App on a Real Android Device
Running the App on an iOS Emulator
Running the App on a Real iOS Device
Working with the Emulators / Using the Emulators
Understanding Error Messages & Fixing Errors
Using the Debugger
Getting Started with the Dart DevTools
Understanding the Repaint Rainbow
Wrapping up the Dart DevTools
Useful Resources & Links
Widgets, Styling, Adding Logic - Building a Real App [PERSONAL EXPENSES APP]
Module Introduction
An Overview of the Core Flutter Widgets
Planning the App
Combining Widgets
Understanding Column Alignment
Columns & Rows
Not a Widget: Adding a Transaction Model & Transaction Data
Mapping Data Into Widgets
Building a Custom List Item
Styling a Container
Styling Text
More Styling!
Styling Time!
Containers vs Columns vs Rows
Using String Interpolation
Installing External Packages & Formatting Dates
DateFormat Patterns
Adding Text Input Widgets (TextField)
Fetching User Input
Splitting the App Into Widgets
Connecting Widgets & Managing Data / State
Adding User Transactions to the List
Making the List Scrollable!
Working with ListViews
Lists, Scrolling & Text Input
Further Input & Output Styling and Configuration
Adding AppBar Buttons & Floating Action Buttons
Showing a Modal Bottom Sheet
Improving & Styling the Modal Bottom Sheet
Configuring & Using Themes
Custom Fonts & Working with Text Themes
Theming
Adding Images to the App
Planning the Chart Widget
Looping Through Lists
More on "for" Loops
Deriving Recent Transactions
Creating Bars for our Chart
Populating the Chart with Values
Finishing the Chart Bars
Flexible & Expanded: Deep Dive
Adding a ListTile Widget
Improving the Overall Chart
Widgets & Configuring Widgets - Summary / Overview
Getting Started with Date Selection
Showing a DatePicker
Adding Transactions with a Date
Deleting Transactions & Using IconButtons
Final Polishing!
Wrap Up
Useful Resources & Links
Responsive & Adaptive User Interfaces and Apps
Module Introduction
What does "Responsive" and "Adaptive" Mean?
Examples: Where we could improve the App!
Calculating Sizes Dynamically
Working with the "textScaleFactor"
Using the LayoutBuilder Widget
Responsiveness
Controlling the Device Orientation
Rendering Alternative Landscape Content - 1
Finishing Landscape Mode
Showing Different Content Based on Device Orientation
Respecting the Softkeyboard Insets
Using the Device Size in Conditions
Managing the MediaQuery Object
Checking the Device Platform
Using Cupertino (iOS) Widgets
Using the SafeArea
More Cupertino Styles
Using Cupertino Buttons
Creating Custom Adaptive Widgets
Adaptive Widgets
Wrap Up
Useful Resources & Links
Widget & Flutter Internals - Deep Dive
Module Introduction
The Problem At Hand
Widget Tree & Element Tree - What, Why and How?
How Flutter Rebuilds & Repaints the Screen
How Flutter Executes build()
Using "const" Widgets & Constructors
Widgets, Elements, build()
Writing Good Code
Extracting Widgets
Using Builder Methods
Understanding the Widget Lifecycle
Calling super.initState() etc.
Understanding the App Lifecycle
Understanding Context
A Problem with Lists & Stateful Widgets
Understanding the Problem Root
Using Keys
Keys, Lists, Stateful Widgets
Wrap Up
Useful Resources & Links
Navigation & Multiple Screens [MEALS APP]
Module Introduction
Planning the App
Starting With The App - Adding Base Data
Creating a Grid & Working with Linear Gradients
Registering a Screen as the Main Screen
Styling & Theming
Navigating to a New Page
Passing Data via the Constructor
Using Named Routes & Passing Data With Named Routes
Screens & Navigation
Diving Deeper into Named Routes
Adding a Meal Model & Data
Selecting Meals for a Chosen Category
Displaying Recipe Items & Using Network Images
Finishing the Meal List Item
Navigating to the Meal Detail Page
onGenerateRoute & onUnknownRoute
More Navigation!
Finishing the Meal Detail Page
Adding a TabBar to the Appbar
Adding a Bottom TabBar
Adding a Custom Drawer
Adding Links to the Drawer
Tabs & Drawers!
Replacing Pages (Instead of Pushing)
Popping Pages & Passing Data Back
Replacing, Popping & Data
Adding Filter Switches
Adding Filtering Logic
Adding a "Mark as Favorite" Feature
A Problem!
Wrap Up
Useful Resources & Links
State Management [SHOP APP]
Module Introduction
Planning the App
Defining a Data Model
Working on the "Products" Grid & Item Widgets
Styling & Theming the App
Adding Navigation to the App
Why State Management? And what is "State" and "State Management"?
Understanding the "Provider" Package & Approach
Using the Right Provider Package Version
Working with Providers & Listeners
[DART DEEP DIVE] Inheritance ("extends") vs Mixins ("with")
Providing non-Objects
Listening in Different Places & Ways
State, State Management & The Provider Package/ Approach
Using Nested Models & Providers
Exploring Alternative Provider Syntaxes
Using "Consumer" instead of "Provider.of"
Local State vs App-wide State
Adding Shopping Cart Data
More on State Management & The Provider Package
Working with Multiple Providers
Connecting the Cart Provider
Working on the Shopping Cart & Displaying a Total
Displaying a List of Cart Items
Making Cart Items Dismissible
Adding Product Detail Data
Providing an Orders Object
Adding Orders
Adding an Orders Screen
Using a Side Drawer
Making Orders Expandable & Stateful Widgets vs Providers
Wrap Up
Useful Resources & Links
Working with User Input & Forms [SHOP APP]
Module Introduction
Snackbars & Undoing "Add to Cart" Actions
Showing Alert Dialogs
Adding a "Manage Products" Page
"Edit Product" Screen & A Problem
Using Forms & Working with Form Inputs
ListView or Column
Managing Form Input Focus
Multiline Inputs & Disposing Objects
Image Input & Image Preview
Submitting Forms
Validating User Input
Adding Validation to All Inputs
[OPTIONAL] Working with Regular Expressions
Saving New Products
Time to Update Products!
Allowing Users to Delete Products
Wrap Up
Useful Resources & Links
Sending Http Requests [SHOP APP]
Module Introduction
On-Device vs Web Storage
How to Connect Flutter to a Database
Preparing Our Backend
How To Send Http Requests
Sending POST Requests
Working with Futures in Dart
[DART DEEP DIVE] Futures & Async Code
Http Requests & Futures
Showing a Loading Indicator
Handling Errors Gracefully
Working with "async" & "await"
Fetching Data, initState & "of(context)"
How to Transform Fetched Data
Implementing Pull-to-Refresh
Updating Data via PATCH Requests
Utilizing Optimistic Updating
Creating Custom Exceptions & More Error Handling
A Challenge For You!
Updating the "Favorite" Status Optimistically
Storing Orders in the Web
Fetching Orders & Fixing an Issue
Using the "FutureBuilder" Widget & Improving the Code
Wrap Up
Useful Resources & Links
Adding User Authentication [SHOP APP]
Module Introduction
How Authentication Works
Prepare Backend
Adding the Auth Screen
Adding User Signup
Allowing Users to Log In
Handling Authentication Errors
Managing the Auth Token Locally (in the App)
Avoiding Issues with Provider Package
Using the "ProxyProvider" and Attaching the Token to Outgoing Http Requests
Adding the Token to All Requests
Connecting the "Favorite" Status to Users
Attaching Products to Users & Filtering By Creator
Attaching Orders to Users
Adding a Logout Functionality
Automatically Logging Users Out (After Some Time)
Automatically Logging Users In
Wrap Up
Useful Resources & Links
Adding Animations [SHOP APP]
Module Introduction
Animations From Scratch (Completely Manually Controlled)
Using the "AnimatedBuilder" Widget
Working with the "AnimatedContainer"
More Built-in Animation & Transition Widgets
Fading Loaded Images In (And Showing a Placeholder)
Adding a "Hero" Transition
Working with Slivers
Practice: Animating Order Boxes
Implementing Custom Route Transitions
Wrap Up
Useful Resources & Links
Using Native Device Features (Camera, Maps, Location, ...) [GREAT PLACES APP]
Module Introduction
Planning the App
PlaceList & Place Provider Setup
Adding the "Add Place" Screen & An Image Input
Using Image Picker & The Device Camera
Storing the Image on the Filesystem (on the Device)
Managing Data & Images via the Provider Package
Handling Errors
Testing on Real Devices
Preparing SQLite
Storing & Fetching Data with SQLite
Adding a Location Input & The "location" Package
Fetching the User Coordinates
Displaying a Static Map Snapshot
Rendering a Dynamic Map (via Google Maps)
Allowing Users to Pick a Location on the Map
Storing the Location in SQLite
Adding a "Place Detail" Screen & Opening the Map in "readonly" Mode
Wrap Up
Useful Resources & Links
Running Native Swift, ObjectiveC, Java or Kotlin Code
Module Introduction
Using a Proper Project Setup
Sending a Method Call from Flutter
Running Android Code
Running iOS Code
Wrap Up
Useful Resources & Links
Publishing to the App Stores
Module Introduction
Preparing the Code
Preparing the App Configuration
Preparing Third-Party Services
Adding Icons & Splash Screens
Publishing Android Apps
Publishing iOS Apps
Useful Resources & Links
Roundup & Next Steps
You did it!
Your Next Steps (To Become an Awesome Developer!)
How to Plan & Develop Successful Apps
Summary of the Course Update
What Changed? What's New? Why did I Update the Course?
Changes you should not miss
The [LEGACY] Sections
[LEGACY] Diving Into the Basics & Understanding Widgets
What does [LEGACY] mean?
Module Introduction
Creating a New Flutter Project
Exploring the Default Project Structure
Diving Into the "main.dart" File
Widgets in Flutter - Theory
Creating a Widget
Understanding Classes & Constructors
Adding the "Build" Method
Adding the Scaffold
Diving Deeper Into the Syntax
Adding Cards & Images
Diving Into the Official Docs
Adding a Button
Creating a Stateful Widget
Managing Data Inside Stateful Widgets
Adding the Stateful Widget & Lists
Splitting our Code Up
Creating the "Product Manager" Widget
Passing Data to Stateful Widgets
initState() and super.initState()
Understanding Lifecycle Hooks
Diving Into Google's Material Design
Understanding Additional Dart Features
Passing Data Up
Understanding "const" & "final"
Dart Types, Syntax & Core Features
Wrap Up
Useful Resources & Links
[LEGACY] Debugging Flutter Apps
Module Introduction
Fixing Syntax Errors
Understanding Runtime Errors & Runtime Messages
Dealing with Logical Errors
Using Breakpoints
Debugging the User Interface
More About Visual Helpers
Wrap Up
Useful Resources & Links
[LEGACY] Running the App on Different Devices
Testing Devices
How to Start the App
Testing a Real Android Device
Using the iOS Emulator & a Real Device
Running the App - Detailed Instructions
Using the Native IDE Consoles
[LEGACY] Working with Lists & Conditionals
Module Introduction
Creating Scrollable Lists with "ListView"
Optimizing the List Loading Behaviour
Rendering Content Conditionally
Alternative Approaches to Render Content Conditionally
One Important Gotcha
Wrap Up
Useful Resources & Links
[LEGACY] Navigation
Module Introduction
Adding Multiple Pages to our App
Adding Buttons
Implementing a Basic Navigation
Improving the Look of the Product Page
Passing Data Around ("Pushing" the Page)
Passing Information Back ("Popping" the Page)
Adding Reactions Upon Button Pressing
Adding the Basic Authentication Page & Replacing Routes
Adding the Sidedrawer & the Hamburger Icon
Understanding Stack Based Navigation
Adding Tabs
Finishing the Tab Navigation
Adding Named Routes
Parsing Route Data Manually
Lifting State Up
Using the Named Routes
Working with "onUnknownRoute" as Fallback
Adding Alert Dialogs
Showing a Modal
Wrap Up
Useful Resources & Links
[LEGACY] Handling User Input
Module Introduction
Saving User Input
Configuring Text Fields
Styling Text Fields
Fixing a Bug & Adding a Button
Using our Form to Create a New Product
Improving the Style of our Form
Fixing a Tiny "Error"
Adding a Switch
Wrap Up
Useful Resources & Links
[LEGACY] Diving Deeper Into Widgets
Module Introduction
Exploring the Widget Catalogue
There's More Than One Widget For The Job
The Most Important Widgets
Working with Text & Fonts
Working with Rows
Decorating Boxes & Styling a Price Tag
Setting Borders
Understanding "Expanded" & "Flexible"
Adding a Background Image
Centering Input Fields
Adding Icons to our Sidemenu
Adding Icon Buttons
Outsourcing Code into Separate Widgets
Refactoring our Code
Creating a Standardized Tile Widget
Adding Separate Methods for Specific Widgets
Optimizing our Project
Responsive Design Problems
Adding Media Queries
Understanding Media Queries with ListView
Working with Themes
Listening to Touch Events with the Gesture Detector
Wrap Up
Useful Resources & Links
[LEGACY] Working with Forms
Module Introduction
Using the Form Widget
Adding Form Validation
Advanced Validation
A Note on the "Price" Input and the Usage of Commas/ Dots
Closing the Keyboard
Submitting Data
Outputting Lists of Products
Re-Using the Product Create Form
Setting Initial Values
Updating Products
Ensuring Input Visibility
Wrap Up
Useful Resources & Links
[LEGACY] Improving the App
Module Introduction
Improving the List Tile
Adding the Dismissible Widget
Deleting Products Upon Swipe
Restructuring the Code & Wrap Up
Useful Resources & Links
[LEGACY] Models & State Management
Module Introduction
What can be Improved?
Adding a Product Model
Creating a Scoped Model
Connecting the Scoped Model
Providing the Scoped Model
Viewing Single Products
Editing & Deleting Products with the Scoped Model
Finishing the Product Model
A Note on Immutability
Creating the Toggle Favorite Method
Working on the Favorite Feature
Adding "notifylisteners"
Finishing the Favorite Feature
Fixing a Bug related to the "Favoriting" Feature
Adding a User Model
MUST READ: Mixins & The Latest version of Dart
Using Mixins to Merge Models
Logging in with the Main & the User Model
Connecting Models & Sharing Data
MUST READ: Changing Mixins Syntax
Improving the Code & Fixing an Error
MUST READ: Unselecting the Product after Editing
Wrap Up
Useful Resources & Links
[LEGACY] Flutter & HTTP
Module Introduction
Understanding the Backend Setup
Sending a POST Request
Using the Response
Getting Data From a Server
Transforming & Extracting Response Data
Displaying a Loading Spinner
Finishing the Loading Spinner
Updating Products
Deleting Products
Using Pull to Refresh
Adding "fadein" to the Image Placeholder
Adjusting the Scoped Model & the Selected Product
Fixing the Product Selection
Handling Error Responses
Generic Error Handling
Adding "async" "await"
Improving our Code
Wrap Up
Useful Resources & Links
[LEGACY] Authentication
Module Introduction
How Authentication Works
Adding a "Confirm Password" Textfield
Implementing the Signup Functionality
Handling Errors
Adding a Spinner Whilst Signing Up
Adding the Signin Functionality
Refactoring our Code
Authenticating Requests with Tokens
Storing the Token on the Device
Signing Users In Automatically
Adding a Logout Button
Adding Autologout
Route Protection & Redirection
Fixing the Manual Logout
Time for a Quick Recap Regarding our Code Structure
Adding Optimistic Updating to Store the Favorite Status
Fetching the Favorite Status
Allow Editing for own Posts Only
Wrap Up
Useful Resources & Links
[LEGACY] Adding Google Maps to our App
Module Introduction
Using MapView with the latest Flutter Version
Unlocking the Required APIs
Requesting Permissions
Preparing our Text Form Field
Adding a Static Dummy Map
Sending a Request to Convert an Address to Coordinates
Adding Geocoding & Maps with Real Coordinates
Working on the Map Control
Storing Location Data in the Database
Fixing a Bug
Loading Location Data from the Backend
Updating an Existing Product's Position
Adding the Update Method for the Location
Adding the Location Package
Using the Location Package with Version >=1.4
Getting the User Location
Preventing Memory Leaks
Displaying the Address
Showing a Fullscreen Map
Wrap Up
Useful Resources & Links
[LEGACY] Accessing the Device Camera
Module Introduction
Adding an Image Picker Button
Adding the "Use Camera" & "Gallery" Buttons
Connecting the "Choose" Buttons to the Image Picker
Adding an Image Preview
Adding Text Editing Controllers
Setting Up Firebase Cloud Functions
Adjusting Firebase Functions (Fixing an Error)
Adding Server Side Code
Reading Incoming Files & Fields
Storing Data and Move it to a Temporary Storage
Deploying our Firebase Cloud Function
Configuring the Upload Request
Setting Headers to Add the Token
Fixing an Error
Fetching & Using Images
Previewing & Editing the Image
Adding the Image Upload Flow
Deleting Images When Deleting a Product
Wrap Up
Useful Resources & Links
[LEGACY] Adding Animations to our Project
Module Introduction
Adding Floating Action Buttons (FABs)
Adding Functionality to our Favorite Button
Working on the Contact Button
Animating the Contact Icon
Animating the Favorite Icon
Animating the Options Button
Fading the Password Field In & Out
Sliding the Password Field In & Out
Adding Hero Widgets
Adding the Sliver Effect
Adding Route Transitions
Wrap Up
Useful Resources & Links
[LEGACY] Polishing & Bugfixing
Module Introduction
Fixing an Autologout Bug
Fixing the Price Input in Landscape Mode
Fixing the Filtered Product Index
Fixing the Product Title Style & the Favorite Product Selection
Toggling the Favorite Status
Clearing All Products Before Fetching
Testing the iPhone & Fixing the Product Reset Logic
Adding Space on the Product Card
Using Flutter Analyze
Possible Code Restructurings
Managing Global Values
Testing the App on an Android Device
Testing the App on an iPhone & Fixing the European Decimal Comma
Useful Resources & Links
[LEGACY] Running Platform Specific Code
Module Introduction
Understanding Material Design & Cupertino
Detecting the Platform
Using Platform Specific Widgets
Adding a Platform Specific Theme
When Should we Use Platform Specific Themes?
iOS Support since Flutter 0.8.2
Wrap Up
Useful Resources & Links
Roundup
Bonus: More Content!