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