Learn Flutter & Dart to Build iOS & Android Apps

A Complete Guide to the Flutter SDK & Flutter Framework for building native iOS and Android apps

Start
  1. Courses
  2. Learn Flutter & Dart to Build iOS & Android Apps

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!

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
  • 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

Section: Introduction

1. Introduction (1:40) Preview
2. What is Flutter? (5:54) Preview
3. Understanding the Flutter Architecture (4:47) Preview
4. How Flutter & Dart Code Gets Compiled To Native Apps (3:12) Preview
5. Join our Online Learning Community (1:00) Preview
6. Understanding Flutter Versions (2:49) Preview
7. Flutter macOS Setup (19:35) Preview
8. macOS Development Environment (4:08) Preview
9. Flutter Windows Setup (31:46) Preview
10. Windows Development Environment (3:45) Preview
11. Flutter & Material Design (1:15) Preview
12. Flutter Alternatives (6:06) Preview
13. Course Outline (6:40) Preview
14. How To Get The Most Out Of The Course (2:40) Preview
15. Useful Resources & Links (1:00) Preview

Section: Flutter Basics [QUIZ APP]

16. Module Introduction (2:25)
17. Creating a New Project (12:15)
18. An Overview of the Generated Files & Folders (8:20)
19. Analyzing the Default App (5:32)
20. Dart Basics (17:17)
21. More Dart Basics (13:06)
22. Quiz 1: Dart Fundamentals (1:00)
23. Building an App From Scratch (11:02)
24. Running the App on an Emulator (3:25)
25. Class Constructors & Named Arguments (8:29)
26. First Summary & Additional Syntax (8:10)
27. Quiz 2: Flutter App Basics (1:00)
28. Building a Widget Tree (7:40)
29. Visible (Input / Output) & Invisible (Layout / Control) Widgets (3:13)
30. Adding Layout Widgets (6:52)
31. Quiz 3: Widget Basics (1:00)
32. Connecting Functions & Buttons (7:30)
33. Anonymous Functions (3:20)
34. Updating Widget Data (Or: Using StatelessWidget Incorrectly) (6:36)
35. [DART DEEP DIVE] Understanding Lists (1:00)
36. Updating Correctly with Stateful Widgets (11:58)
37. Quiz 4: Stateful & Stateless Widgets (1:00)
38. A Brief Look Under The Hood (2:27)
39. Using Private Properties (5:16)
40. Creating a New, Custom Widget (11:50)
41. First Styling & Layouting Steps (8:01)
42. Enums & Multiple Constructors (4:06)
43. Official Docs & The Widget Catalog (2:39)
44. Passing Callback Functions Around (10:38)
45. Introducing Maps (5:52)
46. Mapping Lists to Widgets (10:24)
47. final vs const (10:50)
48. Quiz 5: Advanced Flutter & Dart Basics (1:00)
49. Introducing "if" Statements (6:51)
50. [DART DEEP DIVE] More on "if" Statements (11:15)
51. [DART DEEP DIVE] The "null" Value (2:03)
52. Outputting Widgets Conditionally (2:20)
53. Splitting the App Into Widgets (9:57)
54. Calculating a Total Score (7:46)
55. Getters & "else-if" (6:34)
56. Resetting the Quiz (4:53)
57. Assignment - Basics (Problem) (1:55)
58. Assignment - Basics (Solution) (12:45)
59. Wrap Up (1:53)
60. Useful Resources & Links (1:00)

Section: Running Apps on Different Devices & Debugging Apps

61. Module Introduction (2:00)
62. Running the App on a Real Android Device (3:56)
63. Running the App on an iOS Emulator (5:54)
64. Running the App on a Real iOS Device (1:52)
65. Working with the Emulators / Using the Emulators (2:25)
66. Understanding Error Messages & Fixing Errors (5:27)
67. Using the Debugger (6:21)
68. Getting Started with the Dart DevTools (4:54)
69. Understanding the Repaint Rainbow (3:23)
70. Wrapping up the Dart DevTools (1:34)
71. Useful Resources & Links (1:00)

Section: Widgets, Styling, Adding Logic - Building a Real App [PERSONAL EXPENSES APP]

72. Module Introduction (3:19)
73. An Overview of the Core Flutter Widgets (9:42)
74. Planning the App (2:43)
75. Combining Widgets (9:18)
76. Understanding Column Alignment (6:11)
77. Quiz 6: Columns & Rows (1:00)
78. Not a Widget: Adding a Transaction Model & Transaction Data (8:28)
79. Mapping Data Into Widgets (3:39)
80. Building a Custom List Item (5:26)
81. Styling a Container (5:12)
82. Styling Text (2:46)
83. More Styling! (1:55)
84. Quiz 7: Styling Time! (1:00)
85. Containers vs Columns vs Rows (3:38)
86. Using String Interpolation (5:21)
87. Installing External Packages & Formatting Dates (7:29)
88. Adding Text Input Widgets (TextField) (9:41)
89. Fetching User Input (9:29)
90. Splitting the App Into Widgets (12:44)
91. Connecting Widgets & Managing Data / State (6:33)
92. Adding User Transactions to the List (3:58)
93. Making the List Scrollable! (6:11)
94. Working with ListViews (12:02)
95. Quiz 8: Lists, Scrolling & Text Input (1:00)
96. Further Input & Output Styling and Configuration (8:28)
97. Adding AppBar Buttons & Floating Action Buttons (4:32)
98. Showing a Modal Bottom Sheet (9:32)
99. Improving & Styling the Modal Bottom Sheet (6:30)
100. Configuring & Using Themes (8:41)
101. Custom Fonts & Working with Text Themes (11:07)
102. Quiz 9: Theming (1:00)
103. Adding Images to the App (7:57)
104. Planning the Chart Widget (4:22)
105. Looping Through Lists (13:47)
106. Deriving Recent Transactions (7:24)
107. Creating Bars for our Chart (10:59)
108. Populating the Chart with Values (6:19)
109. Finishing the Chart Bars (5:25)
110. Flexible & Expanded: Deep Dive (10:23)
111. Adding a ListTile Widget (5:29)
112. Improving the Overall Chart (3:08)
113. Widgets & Configuring Widgets - Summary / Overview (5:07)
114. Getting Started with Date Selection (5:19)
115. Showing a DatePicker (11:13)
116. Adding Transactions with a Date (3:07)
117. Deleting Transactions & Using IconButtons (7:02)
118. Final Polishing! (5:34)
119. Wrap Up (3:54)
120. Useful Resources & Links (1:00)

Section: Responsive & Adaptive User Interfaces and Apps

121. Module Introduction (1:37)
122. What does "Responsive" and "Adaptive" Mean? (5:55)
123. Examples: Where we could improve the App! (3:04)
124. Calculating Sizes Dynamically (9:13)
125. Using the LayoutBuilder Widget (7:43)
126. Quiz 10: Responsiveness (1:00)
127. Controlling the Device Orientation (4:19)
128. Rendering Alternative Landscape Content (4:42)
129. Finishing Landscape Mode (2:58)
130. Showing Different Content Based on Device Orientation (5:33)
131. Respecting the Softkeyboard Insets (3:43)
132. Using the Device Size in Conditions (4:10)
133. Managing the MediaQuery Object (2:06)
134. Checking the Device Platform (5:36)
135. Using Cupertino (iOS) Widgets (9:05)
136. Using the SafeArea (1:43)
137. More Cupertino Styles (3:09)
138. Using Cupertino Buttons (3:11)
139. Creating Custom Adaptive Widgets (5:04)
140. Quiz 11: Adaptive Widgets (1:00)
141. Wrap Up (1:43)
142. Useful Resources & Links (1:00)

Section: Widget & Flutter Internals - Deep Dive

143. Module Introduction (2:32)
144. The Problem At Hand (3:13)
145. Widget Tree & Element Tree - What, Why and How? (10:45)
146. How Flutter Rebuilds & Repaints the Screen (8:48)
147. How Flutter Executes build() (9:18)
148. Using "const" Widgets & Constructors (11:16)
149. Quiz 12: Widgets, Elements, build() (1:00)
150. Writing Good Code (3:57)
151. Extracting Widgets (6:07)
152. Using Builder Methods (10:21)
153. Assignment - Builder Methods (Problem) (0:32)
154. Assignment - Builder Methods (Solution) (1:46)
155. Understanding the Widget Lifecycle (12:55)
156. Understanding the App Lifecycle (9:25)
157. Understanding Context (6:46)
158. A Problem with Lists & Stateful Widgets (5:34)
159. Understanding the Problem Root (5:09)
160. Using Keys (11:15)
161. Quiz 13: Keys, Lists, Stateful Widgets (1:00)
162. Wrap Up (1:41)
163. Useful Resources & Links (1:00)

Section: Navigation & Multiple Screens [MEALS APP]

164. Module Introduction (2:23)
165. Planning the App (4:45)
166. Starting With The App - Adding Base Data (11:18)
167. Creating a Grid & Working with Linear Gradients (7:49)
168. Registering a Screen as the Main Screen (3:10)
169. Styling & Theming (7:04)
170. Navigating to a New Page (10:10)
171. Passing Data via the Constructor (2:38)
172. Using Named Routes & Passing Data With Named Routes (6:42)
173. Quiz 14: Screens & Navigation (1:00)
174. Diving Deeper into Named Routes (2:46)
175. Adding a Meal Model & Data (12:44)
176. Selecting Meals for a Chosen Category (4:56)
177. Displaying Recipe Items & Using Network Images (14:59)
178. Finishing the Meal List Item (15:21)
179. Navigating to the Meal Detail Page (7:17)
180. onGenerateRoute & onUnknownRoute (5:27)
181. Quiz 15: More Navigation! (1:00)
182. Finishing the Meal Detail Page (17:34)
183. Adding a TabBar to the Appbar (10:26)
184. Adding a Bottom TabBar (13:12)
185. Adding a Custom Drawer (12:37)
186. Adding Links to the Drawer (4:03)
187. Quiz 16: Tabs & Drawers! (1:00)
188. Replacing Pages (Instead of Pushing) (6:01)
189. Popping Pages & Passing Data Back (17:06)
190. Quiz 17: Replacing, Popping & Data (1:00)
191. Adding Filter Switches (8:31)
192. Adding Filtering Logic (16:19)
193. Adding a "Mark as Favorite" Feature (19:57)
194. A Problem! (2:40)
195. Wrap Up (2:55)
196. Useful Resources & Links (1:00)

Section: State Management [SHOP APP]

197. Module Introduction (2:13)
198. Planning the App (6:55)
199. Defining a Data Model (6:32)
200. Working on the "Products" Grid & Item Widgets (16:24)
201. Styling & Theming the App (5:14)
202. Adding Navigation to the App (10:30)
203. Why State Management? And what is "State" and "State Management"? (6:29)
204. Understanding the "Provider" Package & Approach (2:55)
205. Working with Providers & Listeners (21:09)
206. [DART DEEP DIVE] Inheritance ("extends") vs Mixins ("with") (6:23)
207. Providing non-Objects (1:00)
208. Listening in Different Places & Ways (5:58)
209. Quiz 18: State, State Management & The Provider Package/ Approach (1:00)
210. Using Nested Models & Providers (13:03)
211. Exploring Alternative Provider Syntaxes (6:55)
212. Using "Consumer" instead of "Provider.of" (7:25)
213. Local State vs App-wide State (15:40)
214. Adding Shopping Cart Data (8:39)
215. Quiz 19: More on State Management & The Provider Package (1:00)
216. Working with Multiple Providers (3:41)
217. Connecting the Cart Provider (11:31)
218. Working on the Shopping Cart & Displaying a Total (11:37)
219. Displaying a List of Cart Items (11:17)
220. Making Cart Items Dismissible (8:47)
221. Adding Product Detail Data (4:49)
222. Providing an Orders Object (7:44)
223. Adding Orders (2:47)
224. Adding an Orders Screen (8:11)
225. Using a Side Drawer (5:45)
226. Making Orders Expandable & Stateful Widgets vs Providers (10:29)
227. Wrap Up (3:29)
228. Useful Resources & Links (1:00)

Section: Working with User Input & Forms [SHOP APP]

229. Module Introduction (3:02)
230. Snackbars & Undoing "Add to Cart" Actions (10:30)
231. Showing Alert Dialogs (7:12)
232. Adding a "Manage Products" Page (14:15)
233. "Edit Product" Screen & A Problem (5:06)
234. Using Forms & Working with Form Inputs (7:59)
235. Managing Form Input Focus (4:35)
236. Multiline Inputs & Disposing Objects (4:11)
237. Image Input & Image Preview (13:15)
238. Submitting Forms (12:01)
239. Validating User Input (4:14)
240. Adding Validation to All Inputs (9:50)
241. [OPTIONAL] Working with Regular Expressions (1:00)
242. Saving New Products (3:52)
243. Time to Update Products! (16:19)
244. Allowing Users to Delete Products (3:39)
245. Wrap Up (0:53)
246. Useful Resources & Links (1:00)

Section: Sending Http Requests [SHOP APP]

247. Module Introduction (2:05)
248. On-Device vs Web Storage (4:08)
249. How to Connect Flutter to a Database (3:35)
250. Preparing Our Backend (4:31)
251. How To Send Http Requests (5:56)
252. Sending POST Requests (10:55)
253. Working with Futures in Dart (7:35)
254. [DART DEEP DIVE] Futures & Async Code (9:27)
255. Quiz 20: Http Requests & Futures (1:00)
256. Showing a Loading Indicator (6:59)
257. Handling Errors Gracefully (12:11)
258. Working with "async" & "await" (10:12)
259. Fetching Data, initState & "of(context)" (8:27)
260. How to Transform Fetched Data (7:38)
261. Implementing Pull-to-Refresh (4:56)
262. Updating Data via PATCH Requests (6:35)
263. Utilizing Optimistic Updating (8:07)
264. Creating Custom Exceptions & More Error Handling (9:05)
265. A Challenge For You! (1:48)
266. Updating the "Favorite" Status Optimistically (6:38)
267. Storing Orders in the Web (11:29)
268. Fetching Orders & Fixing an Issue (12:21)
269. Using the "FutureBuilder" Widget & Improving the Code (13:47)
270. Wrap Up (1:54)
271. Useful Resources & Links (1:00)

Section: Adding User Authentication [SHOP APP]

272. Module Introduction (1:44)
273. How Authentication Works (5:46)
274. Prepare Backend (3:39)
275. Adding the Auth Screen (15:49)
276. Adding User Signup (13:33)
277. Allowing Users to Log In (6:03)
278. Handling Authentication Errors (13:10)
279. Managing the Auth Token Locally (in the App) (11:07)
280. Using the "ProxyProvider" and Attaching the Token to Outgoing Http Requests (9:49)
281. Adding the Token to All Requests (8:31)
282. Connecting the "Favorite" Status to Users (10:17)
283. Attaching Products to Users & Filtering By Creator (13:25)
284. Attaching Orders to Users (2:55)
285. Adding a Logout Functionality (4:18)
286. Automatically Logging Users Out (After Some Time) (5:26)
287. Automatically Logging Users In (18:19)
288. Wrap Up (1:36)
289. Useful Resources & Links (1:00)

Section: Adding Animations [SHOP APP]

290. Module Introduction (1:26)
291. Animations From Scratch (Completely Manually Controlled) (14:03)
292. Using the "AnimatedBuilder" Widget (3:51)
293. Working with the "AnimatedContainer" (2:47)
294. More Built-in Animation & Transition Widgets (9:12)
295. Fading Loaded Images In (And Showing a Placeholder) (3:35)
296. Adding a "Hero" Transition (2:35)
297. Working with Slivers (5:55)
298. Practice: Animating Order Boxes (4:00)
299. Implementing Custom Route Transitions (9:50)
300. Wrap Up (0:53)
301. Useful Resources & Links (1:00)

Section: Using Native Device Features (Camera, Maps, Location, ...) [GREAT PLACES APP]

302. Module Introduction (1:35)
303. Planning the App (3:23)
304. PlaceList & Place Provider Setup (12:44)
305. Adding the "Add Place" Screen & An Image Input (17:16)
306. Using Image Picker & The Device Camera (12:11)
307. Storing the Image on the Filesystem (on the Device) (10:15)
308. Managing Data & Images via the Provider Package (15:32)
309. Handling Errors (1:23)
310. Testing on Real Devices (4:37)
311. Preparing SQLite (12:33)
312. Storing & Fetching Data with SQLite (11:48)
313. Adding a Location Input & The "location" Package (9:44)
314. Fetching the User Coordinates (2:29)
315. Displaying a Static Map Snapshot (8:31)
316. Rendering a Dynamic Map (via Google Maps) (13:55)
317. Allowing Users to Pick a Location on the Map (9:43)
318. Storing the Location in SQLite (18:09)
319. Adding a "Place Detail" Screen & Opening the Map in "readonly" Mode (11:33)
320. Wrap Up (1:48)
321. Useful Resources & Links (1:00)

Section: Firebase, Image Upload & Push Notifications

322. Module Introduction (1:51)
323. What is Firebase? (4:12)
324. Getting Started with Firebase (10:56)
325. Creating a New App (4:37)
326. Getting Started with Firestore & the Flutter SDK (16:22)
327. Rendering Stream Data with StreamBuilder (6:26)
328. Adding Data (2:39)
329. Adding a Basic Authentication Screen (10:25)
330. Adding an App Theme (3:39)
331. Creating an Authentication Form (14:02)
332. Connecting Auth Form & Auth Screen (4:58)
333. Implementing Authentication (13:15)
334. Storing Extra User Data (6:57)
335. Finishing Authentication & Adding Logout (7:33)
336. Adding Firebase Security Rules (9:44)
337. Listening to Chat Messages (5:11)
338. Sending & Ordering Chat Messages (11:56)
339. Creating a Base Chat Bubble Widget (6:04)
340. Improving the Chat Bubbles (12:29)
341. Testing on Multiple Devices (4:23)
342. Displaying Usernames (11:36)
343. Adding an Image Picker (13:54)
344. Preparing the File Upload & Image Validation (7:11)
345. Uploading Images (10:55)
346. Improving Image Upload (5:13)
347. Running on a Real iOS Device (2:14)
348. Displaying User Images (11:08)
349. How Push Notifications Work (5:41)
350. An Introduction To Firebase Cloud Messaging (4:26)
351. Android & Push Notifications (9:44)
352. iOS & Push Notifications (13:41)
353. Handling Push Notifications (10:04)
354. Getting Started with Cloud Functions (6:24)
355. Setting a Firestore Trigger (8:50)
356. Sending Automated Push Notifications (8:46)
357. Polishing & Wrap Up (7:15)
358. Updating to the Latest Firebase Package Versions (1:00)
359. Module Resources (1:00)

Section: Running Native Swift, ObjectiveC, Java or Kotlin Code

360. Module Introduction (1:30)
361. Sending a Method Call from Flutter (8:33)
362. Running Android Code (15:01)
363. Running iOS Code (10:25)
364. Wrap Up (0:58)
365. Useful Resources & Links (1:00)

Section: Publishing to the App Stores

366. Module Introduction (1:42)
367. Preparing the Code (2:24)
368. Preparing the App Configuration (5:54)
369. Preparing Third-Party Services (1:18)
370. Adding Icons & Splash Screens (9:07)
371. Publishing Android Apps (8:46)
372. Publishing iOS Apps (6:11)
373. Useful Resources & Links (1:00)

Section: Roundup & Next Steps

374. You did it! (1:11)
375. Your Next Steps (To Become an Awesome Developer!) (3:31)
376. How to Plan & Develop Successful Apps (10:57)

Course Instructor

Image

Maximilian Schwarzmüller

As a self-taught professional I really know the hard parts and the difficult topics when learning new or improving on already-known languages. This background and experience enable me to focus on the most relevant key concepts and topics. My track record of many 5-star rated courses, more than 1,000,000 students worldwide as well as a successful YouTube channel is the best proof for that.

The most rewarding experience for me is to see how people find new, better jobs, build awesome web applications, work on amazing projects or simply enjoy their hobby with the help of my content. That's why, together with Manuel Lorenz, I founded Academind to offer the best possible learning experience and to share the pleasure of learning with our students.