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 courseJoin 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
Course content
Section 1Introduction
- Introduction1:40
- What is Flutter?5:54
- Understanding the Flutter Architecture4:47
- How Flutter & Dart Code Gets Compiled To Native Apps3:12
- Join our Online Learning Community1:00
- Understanding Flutter Versions2:49
- Flutter macOS Setup19:35
- macOS Development Environment4:08
- Flutter Windows Setup31:46
- Windows Development Environment3:45
- Flutter & Material Design1:15
- Flutter Alternatives6:06
- Course Outline6:40
- How To Get The Most Out Of The Course2:40
- Useful Resources & Links1:00
Section 2Flutter Basics [QUIZ APP]
- Module IntroductionPremium2:25
- Creating a New ProjectPremium12:15
- An Overview of the Generated Files & FoldersPremium8:20
- Analyzing the Default AppPremium5:32
- Dart BasicsPremium17:17
- More Dart BasicsPremium13:06
- Quiz 1: Dart FundamentalsPremium1:00
- Building an App From ScratchPremium11:02
- Running the App on an EmulatorPremium3:25
- Class Constructors & Named ArgumentsPremium8:29
- First Summary & Additional SyntaxPremium8:10
- Quiz 2: Flutter App BasicsPremium1:00
- Building a Widget TreePremium7:40
- Visible (Input / Output) & Invisible (Layout / Control) WidgetsPremium3:13
- Adding Layout WidgetsPremium6:52
- Quiz 3: Widget BasicsPremium1:00
- Connecting Functions & ButtonsPremium7:30
- Anonymous FunctionsPremium3:20
- Updating Widget Data (Or: Using StatelessWidget Incorrectly)Premium6:36
- [DART DEEP DIVE] Understanding ListsPremium1:00
- Updating Correctly with Stateful WidgetsPremium11:58
- Quiz 4: Stateful & Stateless WidgetsPremium1:00
- A Brief Look Under The HoodPremium2:27
- Using Private PropertiesPremium5:16
- Creating a New, Custom WidgetPremium11:50
- First Styling & Layouting StepsPremium8:01
- Enums & Multiple ConstructorsPremium4:06
- Official Docs & The Widget CatalogPremium2:39
- Passing Callback Functions AroundPremium10:38
- Introducing MapsPremium5:52
- Mapping Lists to WidgetsPremium10:24
- final vs constPremium10:50
- Quiz 5: Advanced Flutter & Dart BasicsPremium1:00
- Introducing "if" StatementsPremium6:51
- [DART DEEP DIVE] More on "if" StatementsPremium11:15
- [DART DEEP DIVE] The "null" ValuePremium2:03
- Outputting Widgets ConditionallyPremium2:20
- Splitting the App Into WidgetsPremium9:57
- Calculating a Total ScorePremium7:46
- Getters & "else-if"Premium6:34
- Resetting the QuizPremium4:53
- Assignment - Basics (Problem)Premium1:55
- Assignment - Basics (Solution)Premium12:45
- Wrap UpPremium1:53
- Useful Resources & LinksPremium1:00
Section 3Running Apps on Different Devices & Debugging Apps
- Module IntroductionPremium2:00
- Running the App on a Real Android DevicePremium3:56
- Running the App on an iOS EmulatorPremium5:54
- Running the App on a Real iOS DevicePremium1:52
- Working with the Emulators / Using the EmulatorsPremium2:25
- Understanding Error Messages & Fixing ErrorsPremium5:27
- Using the DebuggerPremium6:21
- Getting Started with the Dart DevToolsPremium4:54
- Understanding the Repaint RainbowPremium3:23
- Wrapping up the Dart DevToolsPremium1:34
- Useful Resources & LinksPremium1:00
Section 4Widgets, Styling, Adding Logic - Building a Real App [PERSONAL EXPENSES APP]
- Module IntroductionPremium3:19
- An Overview of the Core Flutter WidgetsPremium9:42
- Planning the AppPremium2:43
- Combining WidgetsPremium9:18
- Understanding Column AlignmentPremium6:11
- Quiz 6: Columns & RowsPremium1:00
- Not a Widget: Adding a Transaction Model & Transaction DataPremium8:28
- Mapping Data Into WidgetsPremium3:39
- Building a Custom List ItemPremium5:26
- Styling a ContainerPremium5:12
- Styling TextPremium2:46
- More Styling!Premium1:55
- Quiz 7: Styling Time!Premium1:00
- Containers vs Columns vs RowsPremium3:38
- Using String InterpolationPremium5:21
- Installing External Packages & Formatting DatesPremium7:29
- Adding Text Input Widgets (TextField)Premium9:41
- Fetching User InputPremium9:29
- Splitting the App Into WidgetsPremium12:44
- Connecting Widgets & Managing Data / StatePremium6:33
- Adding User Transactions to the ListPremium3:58
- Making the List Scrollable!Premium6:11
- Working with ListViewsPremium12:02
- Quiz 8: Lists, Scrolling & Text InputPremium1:00
- Further Input & Output Styling and ConfigurationPremium8:28
- Adding AppBar Buttons & Floating Action ButtonsPremium4:32
- Showing a Modal Bottom SheetPremium9:32
- Improving & Styling the Modal Bottom SheetPremium6:30
- Configuring & Using ThemesPremium8:41
- Custom Fonts & Working with Text ThemesPremium11:07
- Quiz 9: ThemingPremium1:00
- Adding Images to the AppPremium7:57
- Planning the Chart WidgetPremium4:22
- Looping Through ListsPremium13:47
- Deriving Recent TransactionsPremium7:24
- Creating Bars for our ChartPremium10:59
- Populating the Chart with ValuesPremium6:19
- Finishing the Chart BarsPremium5:25
- Flexible & Expanded: Deep DivePremium10:23
- Adding a ListTile WidgetPremium5:29
- Improving the Overall ChartPremium3:08
- Widgets & Configuring Widgets - Summary / OverviewPremium5:07
- Getting Started with Date SelectionPremium5:19
- Showing a DatePickerPremium11:13
- Adding Transactions with a DatePremium3:07
- Deleting Transactions & Using IconButtonsPremium7:02
- Final Polishing!Premium5:34
- Wrap UpPremium3:54
- Useful Resources & LinksPremium1:00
Section 5Responsive & Adaptive User Interfaces and Apps
- Module IntroductionPremium1:37
- What does "Responsive" and "Adaptive" Mean?Premium5:55
- Examples: Where we could improve the App!Premium3:04
- Calculating Sizes DynamicallyPremium9:13
- Using the LayoutBuilder WidgetPremium7:43
- Quiz 10: ResponsivenessPremium1:00
- Controlling the Device OrientationPremium4:19
- Rendering Alternative Landscape ContentPremium4:42
- Finishing Landscape ModePremium2:58
- Showing Different Content Based on Device OrientationPremium5:33
- Respecting the Softkeyboard InsetsPremium3:43
- Using the Device Size in ConditionsPremium4:10
- Managing the MediaQuery ObjectPremium2:06
- Checking the Device PlatformPremium5:36
- Using Cupertino (iOS) WidgetsPremium9:05
- Using the SafeAreaPremium1:43
- More Cupertino StylesPremium3:09
- Using Cupertino ButtonsPremium3:11
- Creating Custom Adaptive WidgetsPremium5:04
- Quiz 11: Adaptive WidgetsPremium1:00
- Wrap UpPremium1:43
- Useful Resources & LinksPremium1:00
Section 6Widget & Flutter Internals - Deep Dive
- Module IntroductionPremium2:32
- The Problem At HandPremium3:13
- Widget Tree & Element Tree - What, Why and How?Premium10:45
- How Flutter Rebuilds & Repaints the ScreenPremium8:48
- How Flutter Executes build()Premium9:18
- Using "const" Widgets & ConstructorsPremium11:16
- Quiz 12: Widgets, Elements, build()Premium1:00
- Writing Good CodePremium3:57
- Extracting WidgetsPremium6:07
- Using Builder MethodsPremium10:21
- Assignment - Builder Methods (Problem)Premium0:32
- Assignment - Builder Methods (Solution)Premium1:46
- Understanding the Widget LifecyclePremium12:55
- Understanding the App LifecyclePremium9:25
- Understanding ContextPremium6:46
- A Problem with Lists & Stateful WidgetsPremium5:34
- Understanding the Problem RootPremium5:09
- Using KeysPremium11:15
- Quiz 13: Keys, Lists, Stateful WidgetsPremium1:00
- Wrap UpPremium1:41
- Useful Resources & LinksPremium1:00
Section 7Navigation & Multiple Screens [MEALS APP]
- Module IntroductionPremium2:23
- Planning the AppPremium4:45
- Starting With The App - Adding Base DataPremium11:18
- Creating a Grid & Working with Linear GradientsPremium7:49
- Registering a Screen as the Main ScreenPremium3:10
- Styling & ThemingPremium7:04
- Navigating to a New PagePremium10:10
- Passing Data via the ConstructorPremium2:38
- Using Named Routes & Passing Data With Named RoutesPremium6:42
- Quiz 14: Screens & NavigationPremium1:00
- Diving Deeper into Named RoutesPremium2:46
- Adding a Meal Model & DataPremium12:44
- Selecting Meals for a Chosen CategoryPremium4:56
- Displaying Recipe Items & Using Network ImagesPremium14:59
- Finishing the Meal List ItemPremium15:21
- Navigating to the Meal Detail PagePremium7:17
- onGenerateRoute & onUnknownRoutePremium5:27
- Quiz 15: More Navigation!Premium1:00
- Finishing the Meal Detail PagePremium17:34
- Adding a TabBar to the AppbarPremium10:26
- Adding a Bottom TabBarPremium13:12
- Adding a Custom DrawerPremium12:37
- Adding Links to the DrawerPremium4:03
- Quiz 16: Tabs & Drawers!Premium1:00
- Replacing Pages (Instead of Pushing)Premium6:01
- Popping Pages & Passing Data BackPremium17:06
- Quiz 17: Replacing, Popping & DataPremium1:00
- Adding Filter SwitchesPremium8:31
- Adding Filtering LogicPremium16:19
- Adding a "Mark as Favorite" FeaturePremium19:57
- A Problem!Premium2:40
- Wrap UpPremium2:55
- Useful Resources & LinksPremium1:00
Section 8State Management [SHOP APP]
- Module IntroductionPremium2:13
- Planning the AppPremium6:55
- Defining a Data ModelPremium6:32
- Working on the "Products" Grid & Item WidgetsPremium16:24
- Styling & Theming the AppPremium5:14
- Adding Navigation to the AppPremium10:30
- Why State Management? And what is "State" and "State Management"?Premium6:29
- Understanding the "Provider" Package & ApproachPremium2:55
- Working with Providers & ListenersPremium21:09
- [DART DEEP DIVE] Inheritance ("extends") vs Mixins ("with")Premium6:23
- Providing non-ObjectsPremium1:00
- Listening in Different Places & WaysPremium5:58
- Quiz 18: State, State Management & The Provider Package/ ApproachPremium1:00
- Using Nested Models & ProvidersPremium13:03
- Exploring Alternative Provider SyntaxesPremium6:55
- Using "Consumer" instead of "Provider.of"Premium7:25
- Local State vs App-wide StatePremium15:40
- Adding Shopping Cart DataPremium8:39
- Quiz 19: More on State Management & The Provider PackagePremium1:00
- Working with Multiple ProvidersPremium3:41
- Connecting the Cart ProviderPremium11:31
- Working on the Shopping Cart & Displaying a TotalPremium11:37
- Displaying a List of Cart ItemsPremium11:17
- Making Cart Items DismissiblePremium8:47
- Adding Product Detail DataPremium4:49
- Providing an Orders ObjectPremium7:44
- Adding OrdersPremium2:47
- Adding an Orders ScreenPremium8:11
- Using a Side DrawerPremium5:45
- Making Orders Expandable & Stateful Widgets vs ProvidersPremium10:29
- Wrap UpPremium3:29
- Useful Resources & LinksPremium1:00
Section 9Working with User Input & Forms [SHOP APP]
- Module IntroductionPremium3:02
- Snackbars & Undoing "Add to Cart" ActionsPremium10:30
- Showing Alert DialogsPremium7:12
- Adding a "Manage Products" PagePremium14:15
- "Edit Product" Screen & A ProblemPremium5:06
- Using Forms & Working with Form InputsPremium7:59
- Managing Form Input FocusPremium4:35
- Multiline Inputs & Disposing ObjectsPremium4:11
- Image Input & Image PreviewPremium13:15
- Submitting FormsPremium12:01
- Validating User InputPremium4:14
- Adding Validation to All InputsPremium9:50
- [OPTIONAL] Working with Regular ExpressionsPremium1:00
- Saving New ProductsPremium3:52
- Time to Update Products!Premium16:19
- Allowing Users to Delete ProductsPremium3:39
- Wrap UpPremium0:53
- Useful Resources & LinksPremium1:00
Section 10Sending Http Requests [SHOP APP]
- Module IntroductionPremium2:05
- On-Device vs Web StoragePremium4:08
- How to Connect Flutter to a DatabasePremium3:35
- Preparing Our BackendPremium4:31
- How To Send Http RequestsPremium5:56
- Sending POST RequestsPremium10:55
- Working with Futures in DartPremium7:35
- [DART DEEP DIVE] Futures & Async CodePremium9:27
- Quiz 20: Http Requests & FuturesPremium1:00
- Showing a Loading IndicatorPremium6:59
- Handling Errors GracefullyPremium12:11
- Working with "async" & "await"Premium10:12
- Fetching Data, initState & "of(context)"Premium8:27
- How to Transform Fetched DataPremium7:38
- Implementing Pull-to-RefreshPremium4:56
- Updating Data via PATCH RequestsPremium6:35
- Utilizing Optimistic UpdatingPremium8:07
- Creating Custom Exceptions & More Error HandlingPremium9:05
- A Challenge For You!Premium1:48
- Updating the "Favorite" Status OptimisticallyPremium6:38
- Storing Orders in the WebPremium11:29
- Fetching Orders & Fixing an IssuePremium12:21
- Using the "FutureBuilder" Widget & Improving the CodePremium13:47
- Wrap UpPremium1:54
- Useful Resources & LinksPremium1:00
Section 11Adding User Authentication [SHOP APP]
- Module IntroductionPremium1:44
- How Authentication WorksPremium5:46
- Prepare BackendPremium3:39
- Adding the Auth ScreenPremium15:49
- Adding User SignupPremium13:33
- Allowing Users to Log InPremium6:03
- Handling Authentication ErrorsPremium13:10
- Managing the Auth Token Locally (in the App)Premium11:07
- Using the "ProxyProvider" and Attaching the Token to Outgoing Http RequestsPremium9:49
- Adding the Token to All RequestsPremium8:31
- Connecting the "Favorite" Status to UsersPremium10:17
- Attaching Products to Users & Filtering By CreatorPremium13:25
- Attaching Orders to UsersPremium2:55
- Adding a Logout FunctionalityPremium4:18
- Automatically Logging Users Out (After Some Time)Premium5:26
- Automatically Logging Users InPremium18:19
- Wrap UpPremium1:36
- Useful Resources & LinksPremium1:00
Section 12Adding Animations [SHOP APP]
- Module IntroductionPremium1:26
- Animations From Scratch (Completely Manually Controlled)Premium14:03
- Using the "AnimatedBuilder" WidgetPremium3:51
- Working with the "AnimatedContainer"Premium2:47
- More Built-in Animation & Transition WidgetsPremium9:12
- Fading Loaded Images In (And Showing a Placeholder)Premium3:35
- Adding a "Hero" TransitionPremium2:35
- Working with SliversPremium5:55
- Practice: Animating Order BoxesPremium4:00
- Implementing Custom Route TransitionsPremium9:50
- Wrap UpPremium0:53
- Useful Resources & LinksPremium1:00
Section 13Using Native Device Features (Camera, Maps, Location, ...) [GREAT PLACES APP]
- Module IntroductionPremium1:35
- Planning the AppPremium3:23
- PlaceList & Place Provider SetupPremium12:44
- Adding the "Add Place" Screen & An Image InputPremium17:16
- Using Image Picker & The Device CameraPremium12:11
- Storing the Image on the Filesystem (on the Device)Premium10:15
- Managing Data & Images via the Provider PackagePremium15:32
- Handling ErrorsPremium1:23
- Testing on Real DevicesPremium4:37
- Preparing SQLitePremium12:33
- Storing & Fetching Data with SQLitePremium11:48
- Adding a Location Input & The "location" PackagePremium9:44
- Fetching the User CoordinatesPremium2:29
- Displaying a Static Map SnapshotPremium8:31
- Rendering a Dynamic Map (via Google Maps)Premium13:55
- Allowing Users to Pick a Location on the MapPremium9:43
- Storing the Location in SQLitePremium18:09
- Adding a "Place Detail" Screen & Opening the Map in "readonly" ModePremium11:33
- Wrap UpPremium1:48
- Useful Resources & LinksPremium1:00
Section 14Firebase, Image Upload & Push Notifications
- Module IntroductionPremium1:51
- What is Firebase?Premium4:12
- Getting Started with FirebasePremium10:56
- Creating a New AppPremium4:37
- Getting Started with Firestore & the Flutter SDKPremium16:22
- Rendering Stream Data with StreamBuilderPremium6:26
- Adding DataPremium2:39
- Adding a Basic Authentication ScreenPremium10:25
- Adding an App ThemePremium3:39
- Creating an Authentication FormPremium14:02
- Connecting Auth Form & Auth ScreenPremium4:58
- Implementing AuthenticationPremium13:15
- Storing Extra User DataPremium6:57
- Finishing Authentication & Adding LogoutPremium7:33
- Adding Firebase Security RulesPremium9:44
- Listening to Chat MessagesPremium5:11
- Sending & Ordering Chat MessagesPremium11:56
- Creating a Base Chat Bubble WidgetPremium6:04
- Improving the Chat BubblesPremium12:29
- Testing on Multiple DevicesPremium4:23
- Displaying UsernamesPremium11:36
- Adding an Image PickerPremium13:54
- Preparing the File Upload & Image ValidationPremium7:11
- Uploading ImagesPremium10:55
- Improving Image UploadPremium5:13
- Running on a Real iOS DevicePremium2:14
- Displaying User ImagesPremium11:08
- How Push Notifications WorkPremium5:41
- An Introduction To Firebase Cloud MessagingPremium4:26
- Android & Push NotificationsPremium9:44
- iOS & Push NotificationsPremium13:41
- Handling Push NotificationsPremium10:04
- Getting Started with Cloud FunctionsPremium6:24
- Setting a Firestore TriggerPremium8:50
- Sending Automated Push NotificationsPremium8:46
- Polishing & Wrap UpPremium7:15
- Updating to the Latest Firebase Package VersionsPremium1:00
- Module ResourcesPremium1:00
Section 15Running Native Swift, ObjectiveC, Java or Kotlin Code
- Module IntroductionPremium1:30
- Sending a Method Call from FlutterPremium8:33
- Running Android CodePremium15:01
- Running iOS CodePremium10:25
- Wrap UpPremium0:58
- Useful Resources & LinksPremium1:00
Section 16Publishing to the App Stores
- Module IntroductionPremium1:42
- Preparing the CodePremium2:24
- Preparing the App ConfigurationPremium5:54
- Preparing Third-Party ServicesPremium1:18
- Adding Icons & Splash ScreensPremium9:07
- Publishing Android AppsPremium8:46
- Publishing iOS AppsPremium6:11
- Useful Resources & LinksPremium1:00
Section 17Roundup & Next Steps
- You did it!Premium1:11
- Your Next Steps (To Become an Awesome Developer!)Premium3:31
- How to Plan & Develop Successful AppsPremium10:57
Course instructor
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.