One Codebase Multiple Platforms 
 
Project Creation & Setting Up a Code Editor for Flutter Development 
 
Running a First Flutter App 
 
Understanding Material Design 
 
Course Resources (Code Snapshots Community & Slides) 
 
Analyzing A New Flutter Project 
 
Form Dart To Machine Code 
 
How Programming Languages Work 
 
Starting From Scratch: Understanding Functions 
 
Importing Features From Packages 
 
Knowledge Check: Flutter & Dart Basics 
 
Using a First Widget & Passing Values to Functions 
 
Positional & Named Arguments 
 
Deep Dive: Position & Named Arguments 
 
Combining Multiple Widgets 
 
Understanding "const" Values 
 
Building More Complex Widget Trees 
 
Understanding Value Types 
 
Configuring Widgets & Understanding Objects 
 
Working with "Configuration Objects" (Non-Widget Objects) 
 
Generics Lists & Adding Gradient Colors 
 
How To Configure Widgets & Objects 
 
Onwards to Custom Widgets: Why Do You Need Them? 
 
Working with Constructor Functions 
 
Splitting Code Across Files 
 
Practice: Create a Custom Widget 
 
Variables & Types - Combining Two Key Concepts 
 
"final" & "const" - Special Kinds Of "Variables" 
 
Instance Variables (Properties) & Configurable Widgets 
 
Practice: Reusable Widgets & Constructor Functions 
 
Displaying Images & Using Multiple Constructor Functions 
 
Adding Buttons & Using Functions As Values 
 
Styling Buttons & Working with Padding 
 
How NOT To Build Interactive Widgets 
 
Introducing Stateful Widgets 
 
Generating Random Numbers 
 
Challenge Solution 1/2 - Creating a Widget 
 
Challenge Solution 2/2 - Working with More Widgets 
 
Adding Transparency to Widgets 
 
Repetition & Exercise: Adding a Stateful Widget 
 
Rendering Content Conditionally 
 
Accepting & Passing Functions as Values 
 
Deep Dive: Flutter's (Stateful) Widget Lifecycle 
 
Using Ternary Expressions & Comparison Operators 
 
Understanding "if" Statements 
 
Using "if" Statements In Lists 
 
if Statements & Comparison Operators 
 
Adding a Data Model & Dummy Data 
 
Creating a Reusable Custom Styled Button 
 
Accessing List Elements & Object Properties 
 
Mapping Lists & Using the Spread Operator 
 
Alignment Margin & Padding 
 
Mutating Values in Memory 
 
Managing The Questions Index As State 
 
Using Third-Party Packages & Adding Google Fonts 
 
Passing Data via Functions Across Widgets 
 
Getting Started with the Results Screen 
 
Passing Data to the Results Screen 
 
Introducing Maps & "for" Loops 
 
Using "for" Loops In Lists 
 
Note: A Typo In The Next Lecture 
 
Accessing Map Values & Using "Type Casting" 
 
Filtering & Analyzing Lists 
 
Making Content Scrollable with SingleChildScrollView 
 
Time to Practice: Flutter Basics 
 
Beyond the Basics: Optional Important Dart Features 
 
The Starting Project & A Problem 
 
Understanding Error Messages 
 
Debugging Apps & Using "Debug Mode" 
 
Working with the Flutter DevTools 
 
Running the App on Real iOS or Android Devices 
 
Starting Setup & Repetition Time! 
 
Adding an Expense Data Model with a Unique ID & Exploring Initializer Lists 
 
Efficiently Rendering Long Lists with ListView 
 
Using Lists Inside Of Lists 
 
Creating a Custom List Item with the Card & Spacer Widgets 
 
Using Icons & Formatting Dates 
 
Setting an AppBar with a Title & Actions 
 
Adding a Modal Sheet & Understanding Context 
 
Handling User (Text) Input with the TextField Widget 
 
Getting User Input on Every Keystroke 
 
Letting Flutter do the Work with TextEditingController 
 
Time to Practice: Adding a New Input 
 
Closing The Modal Manually 
 
Working with "Futures" for Handling Data from the Future 
 
Combining Conditions with AND and OR Operators 
 
Validating User Input & Showing an Error Dialog 
 
Creating a Fullscreen Modal 
 
Using the Dismissible Widget for Dismissing List Items 
 
Showing & Managing "Snackbars" 
 
Getting Started with Theming 
 
Setting & Using a Color Scheme 
 
Using Theme Data in Widgets 
 
Important: Adding Dark Mode 
 
Using Another Kind of Loop (for-in) 
 
Adding Alternative Constructor Functions & Filtering Lists 
 
What is "Responsiveness"? 
 
Locking the Device Orientiation 
 
Updating the UI based on the Available Space 
 
Understanding Size Constraints 
 
Handling to Screen Overlays like the Soft Keyboard 
 
Understanding "Safe Areas" 
 
Using the LayoutBuilder Widget 
 
Building Adaptive Widgets 
 
Three Trees: Widget Tree Element Tree & Render Tree 
 
Refactor & Extract Widgets To Avoid Unnecessary Builds 
 
Understanding Keys - Setup 
 
Which Problem Do Keys Solve? 
 
Understanding & Using Keys 
 
Mutating Values in Memory & Making Sense of var final & const 
 
Displaying Category Items on a Screen 
 
Making any Widget Tappable with InkWell 
 
Loading Meals Data Into a Screen 
 
Adding Cross-Screen Navigation 
 
Passing Data to the Target Screen 
 
Introducing the Stack Widget 
 
Improving the MealItem Widget 
 
Adding Navigation to the MealDetails Screen 
 
Improving the MealDetails Screen 
 
Adding Tab-based Navigation 
 
Passing Functions Through Multiple Layers of Widgets (for State Management) 
 
Managing App-wide State & Data 
 
Closing the Drawer Manually 
 
Replacing Screens (Instead of Pushing) 
 
Adding More Filter Options 
 
Returning Data When Leaving a Screen 
 
Reading & Using Returned Data 
 
An Alternative Navigation Pattern: Using Named Routes 
 
Installing the Solution: Riverpod 
 
How State Management with Riverpod Works 
 
Creating a More Complex Provider with StateNotifier 
 
Using the FavoritesProvider 
 
Triggering a Notifier Method 
 
Getting Started with Another Provider 
 
Combining Local & Provider-managed State 
 
Outsourcing State Into The Provider 
 
Connecting Multiple Providers With Each Other (Dependent Providers) 
 
Swapping The "Favorite Button" Based On Provider State 
 
"riverpod" vs "provider" - There are many Alternatives! 
 
Setup & Understanding Explicit vs Implicit Animations 
 
Explicit Animations: Adding an Animation Controller 
 
Explicit Animations: Playing the Animation with AnimatedBuilder 
 
Finetuning Explicit Animations 
 
Getting Started with Implicit Animations 
 
Configuring Implicit Animations 
 
Adding Multi-Screen Transitions 
 
Setup & A Challenge For You 
 
Challenge Solution 1 - Building & Using Models 
 
Challenge Solution 2 - Building the List UI 
 
Adding a "New Item" Screen 
 
The Form & TextFormField Widgets 
 
A Form-aware Dropdown Button 
 
Getting Form Access via a Global Key 
 
Extracting Entered Values 
 
Passing Data Between Screens 
 
What's a Backend? And Why Would You Want One? 
 
What Is HTTP & How Does It Work? 
 
Setting Up a Dummy Backend (Firebase) 
 
Sending a POST Request to the Backend 
 
Working with the Request & Waiting for the Response 
 
Fetching & Transforming Data 
 
Avoiding Unnecessary Requests 
 
Managing the Loading State 
 
Handling the "No Data" Case 
 
Using the FutureBuilder Widget 
 
Setup & A Challenge For You! 
 
Adding a Place Model (Challenge Solution 1/6) 
 
Adding a "Places" Screen (Challenge Solution 2/6) 
 
Adding an "Add Place" Screen (Challenge Solution 3/6) 
 
Adding "riverpod" & A Provider (Challenge Solution 4/6) 
 
Adding Places with Provider & Displaying Places  (Challenge Solution 5/6) 
 
Adding a "Place Details" Screen (Challenge Solution 6/6) 
 
Adding a "Pick an Image" Input 
 
Installing the "Image Picker" Package 
 
Using the Device Camera For Taking Pictures 
 
Adding the Picked Image to the Model & "Add Place" Form 
 
Previewing the Picked Image 
 
Adding the "location" Package & Starting with the "Get Location" Input Widget 
 
Getting the User's Current Location 
 
Using the Google Maps API - Setup 
 
Using Google's Geocoding API 
 
Storing the Location Data in the Model 
 
Displaying a Location Preview Map Snapshot via Google 
 
Using the Picked Location in the Form 
 
Outputting the Location Data 
 
Installing & Configuring the Google Maps Package 
 
Displaying the Picked Place on a Dynamic Map 
 
Handling Map Taps for Selecting a Location Manually 
 
Using the Map Screen in the "Add Place" Form 
 
Installing Packages for Local (On-Device) Data Storage 
 
Storing the Picked Image Locally 
 
Storing Place Data in a (On-Device) SQL Database 
 
Loading Data from the SQL Database 
 
Using a FutureBuilder for Loading Data 
 
Adding Your Own Native Code 
 
Adding an Authentication Screen 
 
Adding Buttons & Modes to the Authentication Screen 
 
Firebase CLI & SDK Setup 1/2 
 
Firebase CLI & SDK Setup 2/2 
 
Showing Different Screens Based On The Authentication State 
 
Adding a Splash Screen (Loading Screen) 
 
Image Upload: Setup & First Steps 
 
Adding a User Image Picker Widget 
 
Using the ImagePicker Package 
 
Managing The Selected Image In The Authentication Form 
 
Uploading Images To Firebase 
 
Showing a Loading Spinner Whilst Uploading 
 
Adding a Remote Database: Firestore Setup 
 
Sending Data to Firestore 
 
Adding ChatMessages & Input Widgets 
 
A Note About Reading Data From Firestore 
 
Sending & Reading Data To & From Firestore 
 
Loading & Displaying Chat Messages as a Stream 
 
Styling Chat Message Bubbles 
 
Push Notifications - Setup & First Steps 
 
Requesting Permissions & Getting an Address Token 
 
Testing Push Notifications 
 
Working with Notification Topics 
 
Sending Push Notifications Automatically via Cloud Functions