Flutter & Dart - The Complete Guide [2023 Edition]
The entire course was completely re-recorded and updated - it's totally up-to-date with the latest version of Flutter! With the latest update, I also added Push Notifications and Image Upload! Join the most comprehensive & bestselling Flutter course and learn how to build amazing iOS and Android apps! You don't need to learn Android/ Java and iOS/ Swift to build real native mobile apps!
More
Flutter - a framework developed by Google - allows you to learn one language (Dart) and build beautiful native mobile apps in no time. Flutter is a SDK providing the tooling to compile Dart code into native code and it also gives you a rich set of pre-built and pre-styled UI elements (so called widgets) which you can use to compose your user interfaces.
Flutter is extremely trending and gets used for major Google apps like their Adwords app - it's now marked as "ready for production", hence now is the time to jump in and learn it!
This course will teach Flutter & Dart from scratch, NO prior knowledge of either of the two is required! And you certainly don't need any Android or iOS development experience since the whole idea behind Flutter is to only learn one language.
You'll learn Flutter not only in theory but we'll build a complete, realistic app throughout this course. This app will feature both all the core basics as well as advanced features like using Google Maps, the device camera, adding animations and more!
With Flutter, you'll be able to write code only once and ship your apps both to the Apple AppStore and Google Play.
Use Google's Material Design to build beautiful, yet fully customizable, apps in no time with almost zero effort. You can use the rich widget suite Flutter provides to add common UI elements like buttons, switches, forms, toolbars, lists and more - or you simply build your own widgets - Flutter makes that a breeze, too.
Here's what's included in the course:
Detailed setup instructions for both macOS and Windows
A thorough introduction to Flutter, Dart and the concept behind widgets
An overview of the built-in widgets and how you may add your own ones
Debugging tipps & tricks
Page navigation with tabs, side drawers and stack-based navigation
State management solutions
Handling and validating user input
Connecting your Flutter app to backend servers by sending Http requests
User authentication
Adding Google Maps
Using native device features like the camera
Adding beautiful animations & page transitions
Image Upload
Push Notifications - manual approach and automated
How to publish your app to the app stores
And more!
This course is for you if ...
You're interested in building real native mobile apps for the two most popular mobile platforms - iOS and Android
You want to explore the full set of features Flutter offers
Don't want to spend hours learning two completely different languages
Course prerequisites:
Basic programming language knowledge will help a lot but is not a hard requirement
You DON'T need to know Flutter or Dart
You DON'T need to know iOS (Swift/ObjectiveC) or Android (Java)
- Basic programming language will help but is not a must-have
- You can use either Windows, macOS or Linux for Android app development - iOS apps can only be built on macOS though
- NO prior iOS or Android development experience is required
- NO prior Flutter or Dart experience is required - this course starts at zero!
Who this course is for:
- Beginner and experienced developers who are interested in diving into mobile app development using one language for both platforms
- Experienced iOS or Android developers who want to build cross-platform (iOS + Android) apps with one single programming language
What you'll learn:
- Learn Flutter and Dart from the ground up, step-by-step
- Build engaging native mobile apps for both Android and iOS
- Use features like Google Maps, the device camera, authentication and much more!
- Learn how to upload images and how to send manual and automated push notifications
- Learn all the basics without stopping after them: Dive deeply into Flutter & Dart and become an advanced developer
Watch Online Flutter & Dart - The Complete Guide [2023 Edition]
# | Title | Duration |
---|---|---|
1 | Welcome To This Course! | 01:17 |
2 | What Is Flutter? | 02:50 |
3 | Flutter uses Dart! | 01:52 |
4 | One Codebase, Multiple Platforms | 02:57 |
5 | Flutter Setup - Overview | 03:59 |
6 | Windows Setup | 13:27 |
7 | macOS Setup | 17:54 |
8 | Project Creation & Setting Up a Code Editor for Flutter Development | 05:11 |
9 | Running a First Flutter App | 09:07 |
10 | Understanding Material Design | 02:36 |
11 | About This Course | 04:44 |
12 | Module Introduction | 01:22 |
13 | Analyzing A New Flutter Project | 08:51 |
14 | Form Dart To Machine Code | 03:06 |
15 | How Programming Languages Work | 05:52 |
16 | Starting From Scratch: Understanding Functions | 06:06 |
17 | Importing Features From Packages | 05:03 |
18 | How Flutter Apps Start | 02:27 |
19 | Understanding Widgets | 02:53 |
20 | Using a First Widget & Passing Values to Functions | 04:38 |
21 | Positional & Named Arguments | 03:59 |
22 | Combining Multiple Widgets | 02:51 |
23 | Understanding "const" Values | 03:59 |
24 | Building More Complex Widget Trees | 07:26 |
25 | Understanding Value Types | 06:55 |
26 | Configuring Widgets & Understanding Objects | 07:25 |
27 | Working with "Configuration Objects" (Non-Widget Objects) | 05:15 |
28 | Generics, Lists & Adding Gradient Colors | 04:14 |
29 | How To Configure Widgets & Objects | 03:04 |
30 | Practice: Styling Text | 03:28 |
31 | Onwards to Custom Widgets: Why Do You Need Them? | 02:38 |
32 | Understanding Classes | 05:02 |
33 | Building Custom Widgets | 09:28 |
34 | Working with Constructor Functions | 05:57 |
35 | Splitting Code Across Files | 03:19 |
36 | Practice: Create a Custom Widget | 03:50 |
37 | Introducing Variables | 05:23 |
38 | Variables & Types - Combining Two Key Concepts | 02:24 |
39 | "final" & "const" - Special Kinds Of "Variables" | 04:54 |
40 | Instance Variables (Properties) & Configurable Widgets | 10:04 |
41 | Practice: Reusable Widgets & Constructor Functions | 06:41 |
42 | Displaying Images & Using Multiple Constructor Functions | 06:36 |
43 | Adding Buttons & Using Functions As Values | 06:09 |
44 | Styling Buttons & Working with Padding | 06:18 |
45 | How NOT To Build Interactive Widgets | 03:49 |
46 | Introducing Stateful Widgets | 15:07 |
47 | Generating Random Numbers | 07:55 |
48 | Module Summary | 10:22 |
49 | Module Introduction | 02:02 |
50 | A Challenge For You! | 08:52 |
51 | Challenge Solution 1/2 - Creating a Widget | 11:47 |
52 | Challenge Solution 2/2 - Working with More Widgets | 17:07 |
53 | Adding Icons to Buttons | 03:44 |
54 | Adding Transparency to Widgets | 04:23 |
55 | Repetition & Exercise: Adding a Stateful Widget | 10:51 |
56 | Rendering Content Conditionally | 07:03 |
57 | Accepting & Passing Functions as Values | 09:17 |
58 | The "initState" Method | 04:29 |
59 | Using Ternary Expressions & Comparison Operators | 07:06 |
60 | Understanding "if" Statements | 04:53 |
61 | Adding a Data Model & Dummy Data | 08:49 |
62 | Configuring a Column | 05:36 |
63 | Creating a Reusable, Custom Styled Button | 12:06 |
64 | Accessing List Elements & Object Properties | 05:54 |
65 | Mapping Lists & Using the Spread Operator | 07:46 |
66 | Alignment, Margin & Padding | 03:58 |
67 | Mutating Values in Memory | 05:47 |
68 | Managing The Questions Index As State | 05:50 |
69 | More on Button Styling | 07:51 |
70 | Using Third-Party Packages & Adding Google Fonts | 07:27 |
71 | Passing Data via Functions Across Widgets | 13:19 |
72 | More Conditions | 04:28 |
73 | Getting Started with the Results Screen | 08:03 |
74 | Passing Data to the Results Screen | 02:41 |
75 | Introducing Maps & "for" Loops | 12:01 |
76 | Accessing Map Values & Using "Type Casting" | 10:54 |
77 | Combining Columns & Rows | 06:08 |
78 | Expanded To The Rescue! | 03:08 |
79 | Filtering & Analyzing Lists | 07:44 |
80 | Making Content Scrollable with SingleChildScrollView | 04:08 |
81 | Beyond the Basics: Optional, Important Dart Features | 08:54 |
82 | Module Summary | 07:33 |
83 | Module Introduction | 00:57 |
84 | The Starting Project & A Problem | 01:09 |
85 | Understanding Error Messages | 07:37 |
86 | Debugging Apps & Using "Debug Mode" | 15:00 |
87 | Working with the Flutter DevTools | 07:42 |
88 | Module Introduction | 01:39 |
89 | Starting Setup & Repetition Time! | 07:08 |
90 | Adding an Expense Data Model with a Unique ID & Exploring Initializer Lists | 07:00 |
91 | Introducing Enums | 04:11 |
92 | Creating Dummy Data | 04:03 |
93 | Efficiently Rendering Long Lists with ListView | 10:22 |
94 | Using Lists Inside Of Lists | 02:28 |
95 | Creating a Custom List Item with the Card & Spacer Widgets | 16:48 |
96 | Using Icons & Formatting Dates | 07:26 |
97 | Setting an AppBar with a Title & Actions | 06:47 |
98 | Adding a Modal Sheet & Understanding Context | 07:25 |
99 | Handling User (Text) Input with the TextField Widget | 08:15 |
100 | Getting User Input on Every Keystroke | 04:54 |
101 | Letting Flutter do the Work with TextEditingController | 04:11 |
102 | Time to Practice: Adding a New Input | 01:12 |
103 | Exercise Solution | 03:51 |
104 | Closing The Modal Manually | 01:48 |
105 | Showing a Date Picker | 08:34 |
106 | Working with "Futures" for Handling Data from the Future | 07:42 |
107 | Adding a Dropdown Button | 10:58 |
108 | Combining Conditions with AND and OR Operators | 07:49 |
109 | Validating User Input & Showing an Error Dialog | 05:12 |
110 | Saving New Expenses | 06:00 |
111 | Creating a Fullscreen Modal | 02:03 |
112 | Using the Dismissible Widget for Dismissing List Items | 07:47 |
113 | Showing & Managing "Snackbars" | 09:14 |
114 | Getting Started with Theming | 07:44 |
115 | Setting & Using a Color Scheme | 06:40 |
116 | Setting Text Themes | 09:01 |
117 | Using Theme Data in Widgets | 09:03 |
118 | Adding Dark Mode | 07:14 |
119 | Using Another Kind of Loop (for-in) | 05:04 |
120 | Adding Alternative Constructor Functions & Filtering Lists | 04:40 |
121 | Adding Chart Widgets | 10:28 |
122 | Module Summary | 02:46 |
123 | Module Introduction | 00:58 |
124 | What is "Responsiveness"? | 02:07 |
125 | Locking the Device Orientiation | 04:54 |
126 | Updating the UI based on the Available Space | 07:56 |
127 | Understanding Size Constraints | 07:10 |
128 | Handling to Screen Overlays like the Soft Keyboard | 05:13 |
129 | Understanding "Safe Areas" | 02:54 |
130 | Using the LayoutBuilder Widget | 12:05 |
131 | Building Adaptive Widgets | 07:15 |
132 | Module Summary | 01:27 |
133 | Module Introduction | 01:10 |
134 | Three Trees: Widget Tree, Element Tree & Render Tree | 04:47 |
135 | How The UI Is Updated | 06:52 |
136 | Refactor & Extract Widgets To Avoid Unnecessary Builds | 06:35 |
137 | Understanding Keys - Setup | 04:35 |
138 | Which Problem Do Keys Solve? | 05:34 |
139 | Understanding & Using Keys | 04:13 |
140 | Mutating Values in Memory & Making Sense of var, final & const | 06:57 |
141 | Module Summary | 00:56 |
142 | Module Introduction | 02:06 |
143 | Project Setup | 01:36 |
144 | Using a GridView | 07:59 |
145 | Widgets vs Screens | 06:13 |
146 | Displaying Category Items on a Screen | 08:03 |
147 | Making any Widget Tappable with InkWell | 03:35 |
148 | Adding Meals Data | 05:21 |
149 | Loading Meals Data Into a Screen | 06:38 |
150 | Adding Cross-Screen Navigation | 08:42 |
151 | Passing Data to the Target Screen | 04:54 |
152 | Introducing the Stack Widget | 17:02 |
153 | Improving the MealItem Widget | 11:54 |
154 | Adding Navigation to the MealDetails Screen | 09:59 |
155 | Improving the MealDetails Screen | 08:16 |
156 | Adding Tab-based Navigation | 16:35 |
157 | Passing Functions Through Multiple Layers of Widgets (for State Management) | 11:56 |
158 | Managing App-wide State & Data | 05:29 |
159 | Adding a Side Drawer | 14:09 |
160 | Closing the Drawer Manually | 05:36 |
161 | Adding a Filter Item | 07:34 |
162 | Replacing Screens (Instead of Pushing) | 07:59 |
163 | Adding More Filter Options | 02:45 |
164 | Returning Data When Leaving a Screen | 06:19 |
165 | Reading & Using Returned Data | 04:32 |
166 | Applying Filters | 15:51 |
167 | Module Summary | 03:05 |
168 | Module Introduction | 01:30 |
169 | What's The Problem? | 02:09 |
170 | Installing the Solution: Riverpod | 01:21 |
171 | How State Management with Riverpod Works | 01:22 |
172 | Creating a Provider | 03:56 |
173 | Using a Provider | 07:18 |
174 | Creating a More Complex Provider with StateNotifier | 12:19 |
175 | Using the FavoritesProvider | 04:50 |
176 | Triggering a Notifier Method | 05:32 |
177 | Getting Started with Another Provider | 08:25 |
178 | Combining Local & Provider-managed State | 06:34 |
179 | Outsourcing State Into The Provider | 05:37 |
180 | Connecting Multiple Providers With Each Other (Dependent Providers) | 05:20 |
181 | Swapping The "Favorite Button" Based On Provider State | 02:42 |
182 | Module Summary | 03:12 |
183 | Module Introduction | 00:45 |
184 | Setup & Understanding Explicit vs Implicit Animations | 01:53 |
185 | Explicit Animations: Adding an Animation Controller | 09:36 |
186 | Explicit Animations: Playing the Animation with AnimatedBuilder | 08:40 |
187 | Finetuning Explicit Animations | 08:37 |
188 | Getting Started with Implicit Animations | 07:24 |
189 | Configuring Implicit Animations | 05:50 |
190 | Adding Multi-Screen Transitions | 03:55 |
191 | Module Summary | 02:29 |
192 | Module Introduction | 01:19 |
193 | Setup & A Challenge For You | 03:00 |
194 | Challenge Solution 1 - Building & Using Models | 08:07 |
195 | Challenge Solution 2 - Building the List UI | 09:28 |
196 | Adding a "New Item" Screen | 07:46 |
197 | The Form & TextFormField Widgets | 06:24 |
198 | A Form-aware Dropdown Button | 09:17 |
199 | Adding Buttons to a Form | 02:23 |
200 | Adding Validation Logic | 08:12 |
201 | Getting Form Access via a Global Key | 07:20 |
202 | Extracting Entered Values | 09:20 |
203 | Passing Data Between Screens | 07:17 |
204 | Final Challenge Solution | 04:19 |
205 | Module Summary | 01:13 |
206 | Module Introduction | 00:39 |
207 | What's a Backend? And Why Would You Want One? | 03:33 |
208 | What Is HTTP & How Does It Work? | 04:11 |
209 | Setting Up a Dummy Backend (Firebase) | 03:26 |
210 | Adding the http Package | 03:19 |
211 | Sending a POST Request to the Backend | 09:58 |
212 | Working with the Request & Waiting for the Response | 08:57 |
213 | Fetching & Transforming Data | 14:58 |
214 | Avoiding Unnecessary Requests | 04:47 |
215 | Managing the Loading State | 07:08 |
216 | Error Response Handling | 05:15 |
217 | Sending DELETE Requests | 06:45 |
218 | Handling the "No Data" Case | 03:44 |
219 | Better Error Handling | 05:53 |
220 | Module Summary | 02:21 |
221 | Using the FutureBuilder Widget | 18:08 |
222 | Module Introduction | 01:53 |
223 | Setup & A Challenge For You! | 03:45 |
224 | Adding a Place Model (Challenge Solution 1/6) | 02:27 |
225 | Adding a "Places" Screen (Challenge Solution 2/6) | 10:01 |
226 | Adding an "Add Place" Screen (Challenge Solution 3/6) | 09:39 |
227 | Adding "riverpod" & A Provider (Challenge Solution 4/6) | 07:00 |
228 | Adding Places with Provider & Displaying Places (Challenge Solution 5/6) | 07:35 |
229 | Adding a "Place Details" Screen (Challenge Solution 6/6) | 04:56 |
230 | Adding a "Pick an Image" Input | 07:55 |
231 | Installing the "Image Picker" Package | 05:06 |
232 | Using the Device Camera For Taking Pictures | 10:40 |
233 | Adding the Picked Image to the Model & "Add Place" Form | 06:11 |
234 | Previewing the Picked Image | 04:55 |
235 | Adding the "location" Package & Starting with the "Get Location" Input Widget | 08:51 |
236 | Getting the User's Current Location | 06:14 |
237 | Using the Google Maps API - Setup | 03:35 |
238 | Using Google's Geocoding API | 06:24 |
239 | Storing the Location Data in the Model | 03:36 |
240 | Displaying a Location Preview Map Snapshot via Google | 07:18 |
241 | Using the Picked Location in the Form | 03:22 |
242 | Outputting the Location Data | 07:47 |
243 | Installing & Configuring the Google Maps Package | 03:44 |
244 | Adding a "Map" Screen | 09:38 |
245 | Displaying the Picked Place on a Dynamic Map | 02:56 |
246 | Handling Map Taps for Selecting a Location Manually | 04:38 |
247 | Using the Map Screen in the "Add Place" Form | 08:25 |
248 | Installing Packages for Local (On-Device) Data Storage | 04:01 |
249 | Storing the Picked Image Locally | 05:00 |
250 | Storing Place Data in a (On-Device) SQL Database | 08:51 |
251 | Loading Data from the SQL Database | 08:10 |
252 | Using a FutureBuilder for Loading Data | 06:02 |
253 | Module Summary | 02:16 |
254 | Course Roundup | 00:58 |
255 | About the Course Update & How To Proceed | 06:12 |
256 | Introduction | 01:49 |
257 | What is Flutter? | 05:55 |
258 | Understanding the Flutter Architecture | 04:48 |
259 | How Flutter & Dart Code Gets Compiled To Native Apps | 03:13 |
260 | Understanding Flutter Versions | 02:50 |
261 | Flutter macOS Setup | 25:08 |
262 | macOS Development Environment | 19:15 |
263 | Flutter Windows Setup | 21:52 |
264 | Windows Development Environment | 17:58 |
265 | Flutter & Material Design | 01:16 |
266 | Flutter Alternatives | 06:07 |
267 | Course Outline | 06:41 |
268 | How To Get The Most Out Of The Course | 02:41 |
269 | Module Introduction | 02:26 |
270 | Creating a New Project | 06:32 |
271 | An Overview of the Generated Files & Folders | 08:11 |
272 | Analyzing the Default App | 05:33 |
273 | Dart Basics | 17:18 |
274 | More Dart Basics | 13:07 |
275 | Building an App From Scratch | 11:04 |
276 | Running the App on an Emulator | 03:26 |
277 | Class Constructors & Named Arguments | 08:38 |
278 | First Summary & Additional Syntax | 08:12 |
279 | Building a Widget Tree | 07:41 |
280 | Visible (Input / Output) & Invisible (Layout / Control) Widgets | 03:14 |
281 | Adding Layout Widgets | 08:48 |
282 | Connecting Functions & Buttons | 07:31 |
283 | Anonymous Functions | 03:21 |
284 | Updating Widget Data (Or: Using StatelessWidget Incorrectly) | 06:38 |
285 | Updating Correctly with Stateful Widgets | 11:59 |
286 | A Brief Look Under The Hood | 02:28 |
287 | Using Private Properties | 05:18 |
288 | Creating a New, Custom Widget | 11:51 |
289 | First Styling & Layouting Steps | 08:02 |
290 | Enums & Multiple Constructors | 04:08 |
291 | Official Docs & The Widget Catalog | 02:40 |
292 | Passing Callback Functions Around | 12:45 |
293 | Introducing Maps | 05:54 |
294 | Mapping Lists to Widgets | 10:25 |
295 | final vs const | 10:51 |
296 | Introducing "if" Statements | 06:52 |
297 | [DART DEEP DIVE] More on "if" Statements | 11:16 |
298 | [DART DEEP DIVE] The "null" Value & Null Safety | 12:31 |
299 | Outputting Widgets Conditionally | 02:22 |
300 | Splitting the App Into Widgets | 10:38 |
301 | Calculating a Total Score | 09:04 |
302 | Getters & "else-if" | 06:35 |
303 | Resetting the Quiz | 05:18 |
304 | "Old" Button Widgets vs "New" Button Widgets | 14:12 |
305 | Wrap Up | 01:54 |
306 | Module Introduction | 02:01 |
307 | Running the App on a Real Android Device | 03:57 |
308 | Running the App on an iOS Emulator | 05:55 |
309 | Running the App on a Real iOS Device | 01:53 |
310 | Working with the Emulators / Using the Emulators | 02:26 |
311 | Understanding Error Messages & Fixing Errors | 05:28 |
312 | Using the Debugger | 06:22 |
313 | Getting Started with the Dart DevTools | 04:55 |
314 | Understanding the Repaint Rainbow | 03:24 |
315 | Wrapping up the Dart DevTools | 01:35 |
316 | Module Introduction | 03:20 |
317 | An Overview of the Core Flutter Widgets | 09:43 |
318 | Planning the App | 02:44 |
319 | Combining Widgets | 09:19 |
320 | Understanding Column Alignment | 06:12 |
321 | Not a Widget: Adding a Transaction Model & Transaction Data | 08:29 |
322 | Mapping Data Into Widgets | 03:40 |
323 | Building a Custom List Item | 05:27 |
324 | Styling a Container | 05:13 |
325 | Styling Text | 02:47 |
326 | More Styling! | 01:56 |
327 | Containers vs Columns vs Rows | 03:39 |
328 | Using String Interpolation | 05:22 |
329 | Installing External Packages & Formatting Dates | 07:30 |
330 | Adding Text Input Widgets (TextField) | 09:42 |
331 | Fetching User Input | 09:30 |
332 | Splitting the App Into Widgets | 12:46 |
333 | Connecting Widgets & Managing Data / State | 06:34 |
334 | Adding User Transactions to the List | 03:59 |
335 | Making the List Scrollable! | 06:12 |
336 | Working with ListViews | 12:03 |
337 | Further Input & Output Styling and Configuration | 08:29 |
338 | Adding AppBar Buttons & Floating Action Buttons | 04:33 |
339 | Showing a Modal Bottom Sheet | 09:34 |
340 | Improving & Styling the Modal Bottom Sheet | 06:31 |
341 | Configuring & Using Themes | 08:43 |
342 | Custom Fonts & Working with Text Themes | 11:08 |
343 | Adding Images to the App | 07:58 |
344 | Planning the Chart Widget | 04:24 |
345 | Looping Through Lists | 13:48 |
346 | Deriving Recent Transactions | 07:25 |
347 | Creating Bars for our Chart | 11:00 |
348 | Populating the Chart with Values | 07:26 |
349 | Finishing the Chart Bars | 05:27 |
350 | Flexible & Expanded: Deep Dive | 10:24 |
351 | Adding a ListTile Widget | 05:30 |
352 | Improving the Overall Chart | 03:09 |
353 | Widgets & Configuring Widgets - Summary / Overview | 05:08 |
354 | Getting Started with Date Selection | 05:20 |
355 | Showing a DatePicker | 11:14 |
356 | Adding Transactions with a Date | 03:08 |
357 | Deleting Transactions & Using IconButtons | 07:03 |
358 | Final Polishing! | 05:35 |
359 | Wrap Up | 03:55 |
360 | Module Introduction | 01:38 |
361 | What does "Responsive" and "Adaptive" Mean? | 05:56 |
362 | Examples: Where we could improve the App! | 03:05 |
363 | Calculating Sizes Dynamically | 09:14 |
364 | Using the LayoutBuilder Widget | 07:45 |
365 | Controlling the Device Orientation | 04:20 |
366 | Rendering Alternative Landscape Content - 1 | 04:43 |
367 | Finishing Landscape Mode | 02:59 |
368 | Showing Different Content Based on Device Orientation | 05:34 |
369 | Respecting the Softkeyboard Insets | 03:44 |
370 | Using the Device Size in Conditions | 04:11 |
371 | Managing the MediaQuery Object | 02:07 |
372 | Checking the Device Platform | 05:37 |
373 | Using Cupertino (iOS) Widgets | 09:06 |
374 | Using the SafeArea | 01:44 |
375 | More Cupertino Styles | 03:10 |
376 | Using Cupertino Buttons | 03:12 |
377 | Creating Custom Adaptive Widgets | 05:05 |
378 | Wrap Up | 01:44 |
379 | Module Introduction | 02:33 |
380 | The Problem At Hand | 03:14 |
381 | Widget Tree & Element Tree - What, Why and How? | 10:46 |
382 | How Flutter Rebuilds & Repaints the Screen | 08:49 |
383 | How Flutter Executes build() | 09:19 |
384 | Using "const" Widgets & Constructors | 11:17 |
385 | Writing Good Code | 03:58 |
386 | Extracting Widgets | 06:08 |
387 | Using Builder Methods | 10:23 |
388 | Understanding the Widget Lifecycle | 12:56 |
389 | Understanding the App Lifecycle | 09:27 |
390 | Understanding Context | 06:47 |
391 | A Problem with Lists & Stateful Widgets | 05:35 |
392 | Understanding the Problem Root | 05:10 |
393 | Using Keys | 11:16 |
394 | Wrap Up | 01:42 |
395 | Module Introduction | 02:24 |
396 | Planning the App | 04:46 |
397 | Starting With The App - Adding Base Data | 11:19 |
398 | Creating a Grid & Working with Linear Gradients | 07:50 |
399 | Registering a Screen as the Main Screen | 03:12 |
400 | Styling & Theming | 07:05 |
401 | Navigating to a New Page | 10:11 |
402 | Passing Data via the Constructor | 02:40 |
403 | Using Named Routes & Passing Data With Named Routes | 06:43 |
404 | Diving Deeper into Named Routes | 02:47 |
405 | Adding a Meal Model & Data | 12:45 |
406 | Selecting Meals for a Chosen Category | 04:57 |
407 | Displaying Recipe Items & Using Network Images | 15:00 |
408 | Finishing the Meal List Item | 15:22 |
409 | Navigating to the Meal Detail Page | 07:18 |
410 | onGenerateRoute & onUnknownRoute | 05:28 |
411 | Finishing the Meal Detail Page | 17:35 |
412 | Adding a TabBar to the Appbar | 10:27 |
413 | Adding a Bottom TabBar | 13:13 |
414 | Adding a Custom Drawer | 12:38 |
415 | Adding Links to the Drawer | 04:04 |
416 | Replacing Pages (Instead of Pushing) | 04:22 |
417 | Popping Pages & Passing Data Back | 17:07 |
418 | Adding Filter Switches | 08:32 |
419 | Adding Filtering Logic | 16:20 |
420 | Adding a "Mark as Favorite" Feature | 19:59 |
421 | A Problem! | 02:41 |
422 | Wrap Up | 02:56 |
423 | Module Introduction | 02:14 |
424 | Planning the App | 06:56 |
425 | Defining a Data Model | 06:33 |
426 | Working on the "Products" Grid & Item Widgets | 16:25 |
427 | Styling & Theming the App | 05:15 |
428 | Adding Navigation to the App | 10:31 |
429 | Why State Management? And what is "State" and "State Management"? | 06:30 |
430 | Understanding the "Provider" Package & Approach | 02:56 |
431 | Working with Providers & Listeners | 21:10 |
432 | [DART DEEP DIVE] Inheritance ("extends") vs Mixins ("with") | 06:24 |
433 | Listening in Different Places & Ways | 05:59 |
434 | Using Nested Models & Providers | 14:04 |
435 | Exploring Alternative Provider Syntaxes | 06:56 |
436 | Using "Consumer" instead of "Provider.of" | 07:26 |
437 | Local State vs App-wide State | 15:41 |
438 | Adding Shopping Cart Data | 08:40 |
439 | Working with Multiple Providers | 03:42 |
440 | Connecting the Cart Provider | 11:32 |
441 | Working on the Shopping Cart & Displaying a Total | 11:38 |
442 | Displaying a List of Cart Items | 11:18 |
443 | Making Cart Items Dismissible | 08:48 |
444 | Adding Product Detail Data | 04:50 |
445 | Providing an Orders Object | 07:45 |
446 | Adding Orders | 02:49 |
447 | Adding an Orders Screen | 08:12 |
448 | Using a Side Drawer | 05:46 |
449 | Making Orders Expandable & Stateful Widgets vs Providers | 10:30 |
450 | Wrap Up | 03:31 |
451 | Module Introduction | 03:03 |
452 | Snackbars & Undoing "Add to Cart" Actions | 10:31 |
453 | Showing Alert Dialogs | 07:13 |
454 | Adding a "Manage Products" Page | 14:16 |
455 | "Edit Product" Screen & A Problem | 05:07 |
456 | Using Forms & Working with Form Inputs | 08:00 |
457 | Managing Form Input Focus | 04:36 |
458 | Multiline Inputs & Disposing Objects | 04:12 |
459 | Image Input & Image Preview | 13:16 |
460 | Submitting Forms | 12:02 |
461 | Validating User Input | 04:15 |
462 | Adding Validation to All Inputs | 09:51 |
463 | Saving New Products | 03:53 |
464 | Time to Update Products! | 16:20 |
465 | Allowing Users to Delete Products | 03:40 |
466 | Wrap Up | 00:54 |
467 | Module Introduction | 02:06 |
468 | On-Device vs Web Storage | 04:09 |
469 | How to Connect Flutter to a Database | 03:37 |
470 | Preparing Our Backend | 04:32 |
471 | How To Send Http Requests | 05:57 |
472 | Sending POST Requests | 10:56 |
473 | Working with Futures in Dart | 07:36 |
474 | [DART DEEP DIVE] Futures & Async Code | 09:28 |
475 | Showing a Loading Indicator | 07:00 |
476 | Handling Errors Gracefully | 12:12 |
477 | Working with "async" & "await" | 09:53 |
478 | Fetching Data, initState & "of(context)" | 08:29 |
479 | How to Transform Fetched Data | 07:39 |
480 | Implementing Pull-to-Refresh | 04:58 |
481 | Updating Data via PATCH Requests | 06:37 |
482 | Utilizing Optimistic Updating | 08:08 |
483 | Creating Custom Exceptions & More Error Handling | 09:06 |
484 | A Challenge For You! | 01:49 |
485 | Updating the "Favorite" Status Optimistically | 06:40 |
486 | Storing Orders in the Web | 11:30 |
487 | Fetching Orders & Fixing an Issue | 12:23 |
488 | Using the "FutureBuilder" Widget & Improving the Code | 13:48 |
489 | Wrap Up | 01:55 |
490 | Module Introduction | 01:45 |
491 | How Authentication Works | 05:47 |
492 | Prepare Backend | 03:40 |
493 | Adding the Auth Screen | 15:50 |
494 | Adding User Signup | 13:34 |
495 | Allowing Users to Log In | 06:04 |
496 | Handling Authentication Errors | 13:11 |
497 | Managing the Auth Token Locally (in the App) | 11:08 |
498 | Using the "ProxyProvider" and Attaching the Token to Outgoing Http Requests | 09:50 |
499 | Adding the Token to All Requests | 08:32 |
500 | Connecting the "Favorite" Status to Users | 10:19 |
501 | Attaching Products to Users & Filtering By Creator | 13:26 |
502 | Attaching Orders to Users | 02:56 |
503 | Adding a Logout Functionality | 04:19 |
504 | Automatically Logging Users Out (After Some Time) | 05:27 |
505 | Automatically Logging Users In | 18:20 |
506 | Wrap Up | 01:37 |
507 | Module Introduction | 01:27 |
508 | Animations From Scratch (Completely Manually Controlled) | 14:04 |
509 | Using the "AnimatedBuilder" Widget | 03:52 |
510 | Working with the "AnimatedContainer" | 02:48 |
511 | More Built-in Animation & Transition Widgets | 09:13 |
512 | Fading Loaded Images In (And Showing a Placeholder) | 03:36 |
513 | Adding a "Hero" Transition | 02:36 |
514 | Working with Slivers | 05:56 |
515 | Practice: Animating Order Boxes | 04:01 |
516 | Implementing Custom Route Transitions | 09:51 |
517 | Wrap Up | 00:54 |
518 | Module Introduction | 01:36 |
519 | Planning the App | 03:25 |
520 | PlaceList & Place Provider Setup | 12:45 |
521 | Adding the "Add Place" Screen & An Image Input | 17:17 |
522 | Using Image Picker & The Device Camera | 12:12 |
523 | Storing the Image on the Filesystem (on the Device) | 10:16 |
524 | Managing Data & Images via the Provider Package | 15:33 |
525 | Handling Errors | 01:24 |
526 | Testing on Real Devices | 04:38 |
527 | Preparing SQLite | 12:34 |
528 | Storing & Fetching Data with SQLite | 11:49 |
529 | Adding a Location Input & The "location" Package | 09:45 |
530 | Fetching the User Coordinates | 02:30 |
531 | Displaying a Static Map Snapshot | 08:32 |
532 | Rendering a Dynamic Map (via Google Maps) | 13:56 |
533 | Allowing Users to Pick a Location on the Map | 09:44 |
534 | Storing the Location in SQLite | 18:10 |
535 | Adding a "Place Detail" Screen & Opening the Map in "readonly" Mode | 11:34 |
536 | Wrap Up | 01:49 |
537 | Module Introduction | 01:52 |
538 | What is Firebase? | 04:13 |
539 | Creating a New App | 04:38 |
540 | Getting Started with Firebase | 10:57 |
541 | Getting Started with Flutter & the Firebase SDK | 16:23 |
542 | Rendering Stream Data with StreamBuilder | 06:27 |
543 | Adding Data | 02:40 |
544 | A Basic Authentication Screen | 10:26 |
545 | Adding an App Theme | 03:40 |
546 | Creating an Authentication Form | 14:03 |
547 | Connecting Auth Form & Auth Screen | 04:59 |
548 | Implementing Authentication | 13:16 |
549 | Storing Extra User Data | 06:58 |
550 | Finishing Authentication & Logout | 07:34 |
551 | Adding Firebase Security Rules | 09:45 |
552 | Listening to Chat Messages | 05:12 |
553 | Sending & Ordering Chat Messages | 11:57 |
554 | Creating a Basic Chat Bubble Widget | 06:05 |
555 | Improving the Chat Bubbles | 12:30 |
556 | Testing on Multiple Devices | 04:24 |
557 | Displaying User Names | 11:37 |
558 | Adding an Image Picker | 13:55 |
559 | Preparing File Upload & Validating Images | 07:12 |
560 | Uploading Images | 10:56 |
561 | Improving Image Upload | 05:14 |
562 | Running on a Real iOS Device | 02:15 |
563 | Displaying User Images | 11:09 |
564 | How Push Notifications Work | 05:42 |
565 | An Introduction to Firebase Cloud Messaging | 04:27 |
566 | Android & Push Notifications | 09:45 |
567 | iOS & Push Notifications | 13:42 |
568 | Handling Push Notifications | 10:05 |
569 | Getting Started with Firebase Cloud Functions | 06:25 |
570 | Setting a Firestore Trigger | 08:51 |
571 | Sending Automated Push Notifications | 08:47 |
572 | Polishing & Wrap Up | 07:16 |
573 | Module Introduction | 01:31 |
574 | Sending a Method Call from Flutter | 08:34 |
575 | Running Android Code | 15:02 |
576 | Running iOS Code | 10:26 |
577 | Wrap Up | 00:59 |
578 | Module Introduction | 01:43 |
579 | Preparing the Code | 02:25 |
580 | Preparing the App Configuration | 05:55 |
581 | Preparing Third-Party Services | 01:19 |
582 | Adding Icons & Splash Screens | 09:08 |
583 | Publishing Android Apps | 08:47 |
584 | Publishing iOS Apps | 06:12 |
585 | You did it! | 01:12 |
586 | Your Next Steps (To Become an Awesome Developer!) | 03:32 |
587 | How to Plan & Develop Successful Apps | 10:59 |
588 | Course Roundup | 00:56 |