Flutter

Learn Flutter from Scratch

Beginner 0(0 Ratings) 0 Students enrolled
Created by Edu Finite Last updated Wed, 01-Jul-2020 English
What will i learn?
  • Build beautiful multi-screen apps with Flutter
  • Create and publish open source projects using Dart
  • Comprehend the best method for reading the incredible amount of Flutter documentation
  • Master streams and understand reactive programming to create Flutter apps
  • Understand the different approaches for loading and maintaining data in Flutter apps
  • Learn how to build offline-enabled apps with incredibly efficient data loading
  • Store long-term data on a user's physical device using SQLite

Curriculum for this course
397 Lessons 22:00:00 Hours
Course Introduction
5 Lessons 00:12:59 Hours
  • Course Introduction 00:01:51
  • Course Content 00:02:02
  • App Overview 00:03:25
  • Making the most of this course 00:02:27
  • What is Flutter 00:03:14
  • The Dart Language 00:02:26
  • Introduction to Dartpad 00:00:49
  • A simple program 00:01:43
  • Variable declaration and initialization 00:01:44
  • String interpolation 00:03:04
  • Type inference with var 00:03:14
  • Var and final 00:01:55
  • The dynamic keyword 00:01:54
  • Introduction to functions 00:04:19
  • Function return types 00:02:06
  • Optional parameters nullability and default values 00:02:32
  • Named parameters 00:01:59
  • The arrow operator 00:01:52
  • Introduction to classes 00:02:02
  • Class constructors 00:03:06
  • Instance methods 00:02:15
  • Inheritance 00:02:57
  • The super constructor 00:02:00
  • The base Object class and the toString method 00:01:49
  • Overriding the toString method 00:05:26
  • Abstract classes 00:03:22
  • More on abstract classes 00:02:34
  • Using abstract classes with functions 00:01:56
  • Computed properties 00:02:40
  • Mixins 00:04:38
  • Introduction to lists 00:03:44
  • Introduction to maps 00:03:32
  • Generics and type annotations 00:04:54
  • If and else statements 00:03:52
  • The ternary operator 00:02:26
  • The while loop 00:03:14
  • The for loop 00:02:00
  • Closures and the fold method 00:04:13
  • Enumerations 00:02:46
  • Switch statements 00:02:50
  • Wrap-up 00:01:12
  • Flutter setup on macOS 00:02:40
  • Setting the PATH variable 00:04:27
  • Flutter doctor 00:00:51
  • Xcode and iOS simulator setup 00:02:18
  • Installing Android Studio 00:05:55
  • Installing the Android emulator 00:02:21
  • Running Flutter from the command line 00:05:22
  • Flutter setup on Android Studio 00:03:36
  • Installing Visual Studio Code 00:03:12
  • Flutter setup on Windows 00:01:28
  • Updating the path variable 00:02:10
  • Flutter doctor 00:00:55
  • Installing Android Studio 00:04:28
  • Installing the Android emulator 00:03:19
  • Running Flutter from the command line 00:02:58
  • Flutter setup on Android Studio 00:04:20
  • Installing Visual Studio Code 00:02:54
  • Creating a Flutter project with Android Studio 00:03:29
  • A tour of the project folders 00:02:41
  • Running the Android emulator and iOS simulator 00:02:10
  • Overview of the Flutter counter app 00:01:09
  • Hot reload and hot restart 00:04:07
  • Introduction to widgets 00:02:23
  • The MaterialApp widget 00:01:52
  • The Scaffold widget 00:01:52
  • The Flutter widget tree 00:03:26
  • Stateless and stateful widgets 00:02:44
  • Updating the counter with setState 00:02:11
  • Wrap up 00:01:11
  • Overview of the Time tracker app 00:01:43
  • Switching between apps 00:00:55
  • Writing the root widget of the app 00:04:08
  • Adding the MaterialApp 00:02:51
  • Adding some folders to our project 00:02:20
  • Adding a sign-in page 00:03:36
  • The ThemeData class 00:02:13
  • The AppBar widget 00:02:39
  • Preview of the SignInPage layout 00:01:28
  • Adding a Column layout 00:03:18
  • The CrossAxisAlignment property 00:03:56
  • Code formatting with dartfmt 00:04:54
  • Adding some boxes and extracting code into a method 00:03:40
  • Private methods 00:03:26
  • Adding some padding 00:04:34
  • The MainAxisAlignment property 00:01:15
  • Text TextStyle and FontWeight 00:03:13
  • Introduction to buttons 00:01:50
  • Adding the first button 00:03:30
  • Button callbacks explained 00:04:15
  • Customising button colors 00:03:10
  • MaterialColor explained 00:03:09
  • Changing button shapes 00:02:17
  • Making code reusable 00:01:25
  • Creating a reusable custom RaisedButton 00:06:40
  • Creating a reusable SignInButton 00:04:14
  • Setting default values 00:02:23
  • Making the button height configurable 00:03:56
  • Adding the remaining buttons 00:04:37
  • Adding logos introduction 00:01:18
  • Updating the pubspec.yaml file 00:04:03
  • Image variants 00:01:54
  • Adding an image inside a button 00:03:34
  • Arranging widgets horizontally in a Row 00:04:28
  • The Opacity widget 00:02:40
  • Creating a custom SocialSignInButton 00:05:59
  • The required annotation 00:05:04
  • Using assertions for better widget API design 00:09:03
  • Local and remote authentication 00:03:57
  • Introduction to Firebase 00:01:34
  • Creating a Firebase project 00:02:04
  • Configuring Firebase for Android 00:07:58
  • Configuring Firebase for iOS 00:07:23
  • Installing the firebase_auth package 00:03:02
  • Running on iOS using the Xcode legacy build system 00:04:13
  • Running on Android 00:00:48
  • Migrating to AndroidX 00:05:23
  • Signing in anonymously with Firebase 00:04:06
  • Futures async and await 00:06:47
  • The FirebaseAuth singleton and private constructors 00:03:12
  • Explaining the short-hand syntax for callbacks 00:01:26
  • Error handling with trycatch 00:02:44
  • Preview of the sign-in and sign-out flow 00:03:12
  • Creating a landing page widget 00:02:25
  • Adding a FirebaseUser to the LandingPage 00:02:05
  • Adding a callback to the SignInPage 00:02:50
  • Hooking up the onSignIn callback 00:02:24
  • Updating the SignInPage with setState 00:01:21
  • Creating the home page 00:04:03
  • Adding the sign-out functionality 00:03:04
  • Hooking up the onSignOut callback 00:02:35
  • Retrieving the current user when the app starts 00:03:08
  • Fixing the code in initState 00:03:47
  • Explaining global access and scoped access 00:05:43
  • Creating the Auth class 00:03:17
  • Creating the User class 00:03:35
  • The abstract AuthBase class 00:03:03
  • Using the Auth class 00:07:05
  • Lifting state up and its drawbacks 00:04:34
  • State Management App Architecture 00:02:31
  • Introduction to Streams 00:02:44
  • Streams in practice with DartPad 00:04:02
  • Handling errors and closing streams 00:04:52
  • The onAuthStateChanged stream 00:01:44
  • Type safety with Streams 00:02:36
  • Stream.map explained 00:02:37
  • Listening to the onAuthStateChanged stream 00:03:16
  • Introduction to StreamBuilder 00:03:14
  • Adding a CircularProgressIndicator 00:02:18
  • More on StreamBuilder 00:03:49
  • Refactoring the sign-in flows 00:03:49
  • Fixing the StreamBuilder code 00:02:16
  • Summary on Streams and StreamBuilder 00:02:58
  • Overview of the Firebase sign-in methods 00:02:00
  • Enabling support for Google Sign In 00:02:31
  • Adding Google Sign-In to the Auth class 00:06:50
  • Hooking up Google Sign-In to our button 00:01:50
  • Configuring Google Sign-In on iOS 00:03:57
  • Google Sign-In flow explained 00:03:17
  • Supporting Google Sign Out 00:02:13
  • Testing Google Sign-In on Android 00:02:57
  • Viewing registered users on the Firebase console 00:00:47
  • Registering a Facebook App 00:07:33
  • Enabling Facebook Sign-In on Firebase 00:02:29
  • Adding the Facebook Sign-In code 00:06:02
  • Testing Facebook Sign-In on Android 00:03:38
  • Facebook iOS setup in Xcode 00:04:40
  • Testing Facebook Sign-In on iOS 00:02:11
  • Accessing the users data and privacy considerations 00:02:56
  • Preview of the email password sign-in page 00:02:21
  • Creating the email password sign-in page 00:02:00
  • Passing the BuildContext across methods 00:01:49
  • Introduction to navigation 00:05:21
  • Adding a Card widget 00:02:04
  • Adding the email and password text fields 00:05:18
  • Adding the submit buttons 00:02:22
  • Creating a FormSubmitButton widget 00:03:32
  • Adding a TextEditingController 00:05:24
  • Toggling the form type 00:06:22
  • Adding the email password authentication code 00:03:59
  • Implementing the submit method 00:03:00
  • Testing email password sign-in 00:02:56
  • Customising the email and password text fields 00:03:33
  • Using FocusNode and FocusScope 00:04:48
  • Disabling the submit button on empty email or password 00:05:31
  • Adding a StringValidator class 00:02:29
  • Adding an email and password validation mixin 00:02:51
  • Showing an error text when the email or password are invalid 00:03:17
  • Tweaking form submission 00:04:46
  • Simulating a slow network with a delay 00:02:52
  • Adding a loading state to our form 00:03:36
  • Updating the email focus logic 00:02:15
  • Fixing the vertical overflow on small screens 00:03:37
  • Wrap-up 00:04:42
  • Introduction to dialogs 00:01:19
  • Showing a dialog 00:02:50
  • Dismissing dialogs 00:02:15
  • Platform-aware widgets on iOS Android more 00:04:03
  • Creating a PlatformWidget base class 00:02:50
  • Creating a PlatformAlertDialog widget 00:07:46
  • Showing the PlatformAlertDialog 00:05:43
  • Tweaking the PlatformAlertDialog 00:03:55
  • Adding a sign-out confirmation alert 00:03:47
  • Adding a cancel button to the PlatformAlertDialog 00:04:15
  • Creating an AuthProvider 00:05:46
  • Accessing the Auth object via the AuthProvider 00:06:31
  • Adding the provider package 00:01:37
  • Adding MultiDex support on Android 00:02:00
  • Using the Provider class 00:04:24
  • Wrap-up about scoped access 00:04:13
  • Introduction to InheritedWidget 00:03:36
  • Module Introduction 00:01:09
  • PlatformException explained 00:03:14
  • Creating a PlatformExceptionAlertDialog 00:02:49
  • Customising error messages 00:04:20
  • Using PlatformException on the SignInPage 00:04:24
  • Adding a loading state overview 00:01:12
  • Adding a loading state to the SignInPage 00:02:37
  • Using the loading state in the SignInPage 00:03:36
  • The dispose method 00:02:58
  • Introduction to state management with BLoCs 00:04:50
  • The application layers 00:01:41
  • BLoCs sinks streams and asynchronous code 00:04:53
  • Introduction to the SignInBloc 00:02:51
  • Implementing a simple BLoC 00:03:27
  • Adding a Bloc with Provider inside a static method 00:02:52
  • Adding the StreamBuilder code 00:02:43
  • Converting the SignInPage to a stateless widget 00:03:02
  • The difference between Provider.of and Consumer 00:03:24
  • Disposing BLoCs with Provider 00:01:03
  • Adding authentication code to the SignInBloc 00:05:48
  • Updating the SignInPage 00:02:24
  • Fixing the BLoC submit method 00:02:56
  • Summary on the BLoC basics 00:01:16
  • Introduction to the email sign-in flow with BLoC 00:02:36
  • Creating a model class for the EmailSignInForm 00:02:49
  • Creating the EmailSignInBloc with a StreamController 00:02:32
  • Updating the model 00:06:39
  • Adding the BLoC submit method 00:04:58
  • Setting up the EmailSignInFormBlocBased with Provider 00:05:04
  • Refactoring the EmailSignInFormBlocBased widget by removing the state variables 00:07:24
  • Moving the business logic to the BLoC class 00:03:36
  • Fixing the EmailSignInBloc submit method 00:00:58
  • Moving more business logic to the model class 00:06:32
  • The benefits of separation of concerns with BLoC 00:03:00
  • Using stateful widgets with TextEditingControllers 00:03:36
  • Considerations about performance 00:02:06
  • Blocs and Services in the widget tree 00:03:38
  • Recap on State Management 00:02:24
  • Introduction to ValueNotifier 00:02:07
  • Adding a ValueNotifier with ChangeNotifierProvider 00:04:53
  • Consumer and ChangeNotifierProvider explained 00:03:38
  • Differences between BLoCstreams and ValueNotifierChangeNotifierProvider 00:02:54
  • Introduction to ChangeNotifier 00:01:26
  • Adding the EmailSignInChangeModel class 00:04:48
  • Completing the EmailSignInChangeModel class 00:02:43
  • Implementing the email sign-in form with ChangeNotifier 00:05:56
  • Comparing ValueNotifier and ChangeNotifier 00:03:24
  • Wrap up on State Management 00:03:46
  • Wrap up on the Authentication Flows 00:02:06
  • Overview of the time tracker app 00:02:38
  • Database schema and SQL vs NoSQL 00:04:28
  • Introduction to Cloud Firestore 00:02:27
  • Documents and Collections 00:02:01
  • Getting started with Firestore 00:03:20
  • Designing a Database API with CRUD operations 00:03:22
  • Managing private user data with Cloud Firestore 00:03:22
  • Installing Cloud Firestore 00:01:05
  • Renaming the HomePage to JobsPage 00:02:31
  • Adding the Database class 00:03:02
  • Adding the Database Provider 00:01:44
  • Adding a FloatingActionButton 00:02:18
  • Writing data to Firestore 00:07:37
  • Defining a strongly-typed Job model class 00:04:09
  • Defining a common API path class 00:02:51
  • Adding a generic setData method 00:03:09
  • Adding security rules 00:04:55
  • Handling Firestore permissions errors 00:04:13
  • Reading data from Firestore 00:05:11
  • Reading and parsing Firestore data streams 00:03:46
  • Adding a StreamBuilder to show a list of jobs 00:04:09
  • Debugging the StreamBuilder code 00:04:55
  • Firestore as a realtime database 00:02:08
  • Adding a factory constructor to our model class 00:02:46
  • Adding a generic method to read Firestore streams 00:03:02
  • Adding a FirestoreService class 00:04:43
  • Wrap-up on Cloud Firestore 00:03:15
  • Introduction to Forms with Cloud Firestore 00:01:51
  • Adding a new job page 00:05:07
  • The Placeholder widget 00:04:00
  • Introduction to Form and TextFormField 00:03:41
  • Validating and saving Form data 00:08:04
  • Accessing the Database object with the correct BuildContext 00:04:42
  • Saving jobs with a unique document ID 00:04:54
  • Handling errors 00:01:56
  • Enforcing unique job names 00:03:24
  • Fixing the integer-parsing code 00:01:27
  • Editing existing jobs overview 00:01:16
  • Adding a custom JobListTile 00:03:51
  • Repurposing the AddJobPage for editing jobs 00:04:47
  • Reading the documentID from Firestore 00:02:57
  • Completing the code for editing jobs 00:04:41
  • Wrap up on working with Forms 00:02:47
  • Intro and multiple states of UI 00:01:53
  • Adding an empty content widget 00:03:33
  • Adding a reusable list items builder 00:04:46
  • Using ListView.builder 00:04:52
  • Using ListView.separated 00:02:50
  • Deleting jobs from Firestore 00:02:39
  • Adding swipe to delete support 00:06:57
  • Working with entries overview 00:01:51
  • Relational data drawbacks of NoSQL databases 00:04:19
  • Getting ready to add new files 00:01:21
  • Adding the source files to the project 00:03:01
  • Connecting the new code and updating the Firestore rules 00:02:54
  • Fixing the EditJobPage navigation 00:03:18
  • Overview of the JobEntriesPage 00:02:29
  • Reading and writing entries with Firestore 00:05:25
  • The EntryListItem widget (using InkWell and Expanded) 00:02:05
  • Formatting dates and currencies with the Intl package 00:02:31
  • Dart as UI Spreads and Collection-if 00:02:54
  • Using date pickers with stateful widgets 00:05:28
  • Date and time input with a custom UI and DateTimePicker 00:04:07
  • Updating the UI when a Job changes 00:05:11
  • Wrap up and CupertinoDatePicker 00:01:25
  • Introduction to bottom navigation 00:02:01
  • Multiple navigation stacks 00:01:46
  • Creating a HomePage with a selected tab 00:03:57
  • Adding a CupertinoTabScaffold 00:06:38
  • Testing the bottom navigation 00:02:35
  • Adding the widget builders 00:04:37
  • Replacing the FloatingActionButtons 00:04:27
  • Moving the logout button to the AccountPage 00:02:13
  • Presenting modal routes with the root navigator 00:03:44
  • Using Provider with listen false to minimise rebuilds 00:04:28
  • The CupertinoPageRoute 00:01:02
  • Handling the Android back button with WillPopScope and navigator keys 00:05:36
  • Adding pop-to-root navigation 00:01:44
  • Wrap up on multiple navigators 00:01:44
  • Introduction to advanced stream operations 00:02:53
  • Introduction to RxDart 00:02:33
  • Observable.combineLatest and data transformations in the time tracker app 00:03:22
  • Adding the source code for the new entries page 00:01:26
  • Reviewing the UI code for the entries page 00:04:03
  • Using combineLatest in practice 00:04:23
  • Data manipulation in the EntriesBloc 00:04:10
  • Wrap up on Observables 00:01:41
  • Single subscription vs broadcast streams 00:03:03
  • PublishSubject ReplaySubject BehaviorSubject 00:01:59
  • Adding a BehaviorSubject to the EmailSignInBloc 00:04:03
  • Wrap up and notes about local and remote state management 00:02:28
  • Completing the time tracker app overview 00:00:49
  • Accessing the User object in the AccountPage 00:03:48
  • Adding an Avatar image 00:04:42
  • Finishing the Avatar code 00:03:18
  • Fixing a small bug in the entries page 00:01:13
  • Wrapping up the time tracker app 00:00:38
  • Introduction to writing tests 00:02:07
  • Testing Flutter Apps 00:02:32
  • Writing the first unit test 00:03:31
  • Running tests 00:01:32
  • Checking and fixing errors in tests 00:01:19
  • Testing edge cases by writing and fixing failing tests 00:02:54
  • Grouping tests together 00:03:06
  • The setUp method and testing date formatting with locales 00:03:43
  • The test lifecycle methods 00:01:47
  • Completing the formatting tests 00:03:26
  • Testing model classes 00:03:49
  • hashCode and the operator 00:04:58
  • Adding a toString() method wrap up on unit tests 00:04:55
  • Introduction to widget tests 00:03:38
  • Finding widgets and matcher arguments 00:03:07
  • Testing widget callbacks 00:02:35
  • Working with Acceptance Criteria 00:01:17
  • Introduction to test mocks and mockito 00:02:00
  • Injecting mock objects with Provider 00:04:30
  • Verifying mock methods 00:03:33
  • Working with keys entering text and the pump() method 00:06:19
  • Testing widget updates on state changes 00:02:53
  • Completing the email sign-in tests 00:02:17
  • Replacing Navigator.pop with a callback when the user signs in 00:02:31
  • Updating the tests to handle the form callback 00:02:13
  • Stubbing mock objects 00:05:11
  • Recap on the email sign in forms and stubbing mocks 00:02:23
  • Using widget tests with StreamBuilder 00:03:22
  • Using StreamController inside tests 00:06:54
  • Test setup for the SignInPage 00:03:17
  • Adding keys to custom widget classes 00:02:40
  • Testing navigation 00:04:45
  • The great thing about widget tests 00:02:06
  • Testing ValueNotifier models 00:07:15
  • Testing ChangeNotifier models 00:03:37
  • Testing BloCs 00:03:27
  • Comparing EmailSignInModel objects 00:01:18
  • Testing streams in Blocs 00:08:01
  • Wrap up on unit widget tests 00:01:25
  • Conclusion and Next Steps 00:04:09
Requirements
  • Previous programming experience with Javascript, Java, Python, or similar is required .
+ View more
Description

Flutter is a Google SDK for building native interfaces for iOS and Android using the Dart programming language. Flutter can integrate with existing iOS and Android code bases. It's free and open-source.

+ View more
Other related courses
About the instructor
  • 0 Reviews
  • 4 Students
  • 14 Courses
+ View more
Student feedback
0
Average rating
  • 0%
  • 0%
  • 0%
  • 0%
  • 0%
Reviews
Rs599
Buy now
Includes:
  • 22:00:00 Hours On demand videos
  • 397 Lessons
  • Access on mobile and tv
  • Full lifetime access