Skip to navigation
Skip to navigation
Skip to search form
Skip to login form
Skip to footer
Skip to main content
MVP189
LEO777
LEO777
LEO777
LEO777
LEO777
LEO777
LEO777
LEO777
LEO777
PAREPOS
JAVABET99
KONTAN88
PEWE128
LAGA88
SKY99IDN
BUANA88
BOXING55
DEWISRI88
DEWISRI88
DEWISRI88
MVP189
slot mania
MVP189
situs tergacor
pg slot wallet
Accessibility options
Accessibility profiles
Visual impairment
Seizure and epileptic
Color vision deficiency
ADHD
Learning
Content adjustments
Readable font
Highlight titles
Highlight links
Stop animations
Text size
+
+ +
+ + +
Line height
+
+ +
+ + +
Text spacing
+
+ +
+ + +
Color adjustments
Dark contrast
Light contrast
High contrast
High saturation
Low saturation
Monochrome
Orientation adjustments
Reading guide
Reading Mask
Big black cursor
Big white cursor
Email: it@huph.edu.vn
Email: it@huph.edu.vn
Các khóa học
Link list
Đổi giao diện
Giao diện cũ
Giao diện mới
Learning AI
Machine Learning cơ bản
en
English
Technology
Web Design
Flutter & Firebase Build a Complete App for iOS & Android
0 students
Last updated
Apr 2025
Enrol now
Overview
Course content
Instructors
About the course
Show more...
Course content
Sections:
25
•
Activities:
0
•
Resources:
369
Expand all
Section 1
Course Introduction
001-Course Introduction-gitir
002-Course Content-gitir
003-App Overview-gitir
004-Making the most of this course-gitir
006-What is Flutter-gitir
Section 2
Introduction to Dart
007-The Dart Language-gitir
008-Introduction to Dartpad-gitir
009-A simple program-gitir
010-Variable declaration and initialization-gitir
011-String interpolation-gitir
012-Type inference with var-gitir
013-Var and final-gitir
014-The dynamic keyword-gitir
015-Introduction to functions-gitir
016-Function return types-gitir
017-Optional parameters nullability and default values-gitir
018-Named parameters-gitir
019-The arrow operator-gitir
020-Introduction to classes-gitir
021-Class constructors-gitir
022-Instance methods-gitir
023-Inheritance-gitir
024-The super constructor-gitir
025-The base Object class and the toString method-gitir
026-Overriding the toString method-gitir
027-Abstract classes-gitir
028-More on abstract classes-gitir
029-Using abstract classes with functions-gitir
030-Computed properties-gitir
031-Mixins-gitir
032-Introduction to lists-gitir
033-Introduction to maps-gitir
034-Generics and type annotations-gitir
035-If and else statements-gitir
036-The ternary operator-gitir
037-The while loop-gitir
038-The for loop-gitir
039-Closures and the fold method-gitir
040-Enumerations-gitir
041-Switch statements-gitir
042-Wrap up-gitir
Section 3
Flutter setup on macOS
045-Flutter setup on macOS-gitir
046-Setting the PATH variable-gitir
047-Flutter doctor-gitir
048-Xcode and iOS simulator setup-gitir
049-Installing Android Studio-gitir
050-Installing the Android emulator-gitir
051-Running Flutter from the command line-gitir
052-Flutter setup on Android Studio-gitir
053-Installing Visual Studio Code-gitir
Section 4
Flutter setup on Windows
055-Flutter setup on Windows-gitir
056-Updating the path variable-gitir
057-Flutter doctor-gitir
058-Installing Android Studio-gitir
059-Installing the Android emulator-gitir
060-Running Flutter from the command line-gitir
061-Flutter setup on Android Studio-gitir
062-Installing Visual Studio Code-gitir
Section 5
Introduction to Flutter
064-Creating a Flutter project with Android Studio-gitir
066-A tour of the project folders-gitir
067-Running the Android emulator and iOS simulator-gitir
068-Overview of the Flutter counter app-gitir
069-Hot reload and hot restart-gitir
070-Introduction to widgets-gitir
071-The MaterialApp widget-gitir
072-The Scaffold widget-gitir
073-The Flutter widget tree-gitir
074-Stateless and stateful widgets-gitir
075-Updating the counter with setState-gitir
076-Wrap up-gitir
Section 6
Building Layouts
079-Overview of the Time tracker app-gitir
080-Switching between apps-gitir
081-Writing the root widget of the app-gitir
082-Adding the MaterialApp-gitir
083-Adding some folders to our project-gitir
084-Adding a sign in page-gitir
085-The ThemeData class-gitir
086-The AppBar widget-gitir
087-Preview of the SignInPage layout-gitir
088-Adding a Column layout-gitir
089-The CrossAxisAlignment property-gitir
090-Code formatting with dartfmt-gitir
091-Adding some boxes and extracting code into a method-gitir
092-Private methods-gitir
093-Adding some padding-gitir
094-The MainAxisAlignment property-gitir
095-Text TextStyle and FontWeight-gitir
096-Introduction to buttons-gitir
097-Adding the first button-gitir
098-Button callbacks explained-gitir
099-Customising button colors-gitir
100-MaterialColor explained-gitir
101-Changing button shapes-gitir
102-Making code reusable-gitir
103-Creating a reusable custom RaisedButton-gitir
104-Creating a reusable SignInButton-gitir
105-Setting default values-gitir
106-Making the button height configurable-gitir
107-Adding the remaining buttons-gitir
108-Adding logos introduction-gitir
109-Updating the pubspec yaml file-gitir
110-Image variants-gitir
111-Adding an image inside a button-gitir
112-Arranging widgets horizontally in a Row-gitir
113-The Opacity widget-gitir
114-Creating a custom SocialSignInButton-gitir
115-The required annotation-gitir
116-Using assertions for better widget API design-gitir
Section 7
Firebase Authentication
118-Local and remote authentication-gitir
119-Introduction to Firebase-gitir
120-Creating a Firebase project-gitir
121-Configuring Firebase for Android-gitir
123-Configuring Firebase for iOS-gitir
124-Installing the firebase core and firebase auth packages-gitir
128-Signing in anonymously with Firebase-gitir
129-The FirebaseAuth singleton and private constructors-gitir
130-Explaining the short hand syntax for callbacks-gitir
131-Error handling with try catch-gitir
Section 8
Full Authentication Flow, State Management & Dependency Injection
135-Creating a landing page widget-gitir
136-Adding a Firebase User to the LandingPage-gitir
137-Adding a callback to the SignInPage-gitir
138-Hooking up the onSignIn callback-gitir
139-Creating the home page-gitir
140-Adding the sign out functionality-gitir
141-Hooking up the onSignOut callback-gitir
142-Retrieving the current user when the app starts-gitir
143-Explaining global access and scoped access-gitir
144-Creating the Auth class-gitir
145-The abstract AuthBase class-gitir
146-Using the Auth class-gitir
147-Lifting state up and its drawbacks-gitir
148-State Management App Architecture-gitir
134-Preview of the sign in and sign out flow-gitir
Section 9
Streams and StreamBuilder
149-Introduction to Streams-gitir
150-Streams in practice with DartPad-gitir
151-Handling errors and closing streams-gitir
155-More on StreamBuilder-gitir
156-Refactoring the sign in flows-gitir
Section 10
Google and Facebook Sign-In
159-Overview of the Firebase sign in methods-gitir
160-Enabling support for Google Sign In-gitir
161-Adding Google Sign In to the Auth class-gitir
162-Hooking up Google Sign In to our button-gitir
163-Configuring Google Sign In on iOS-gitir
164-Google Sign In flow explained-gitir
165-Supporting Google Sign Out-gitir
166-Testing Google Sign In on Android-gitir
168-Viewing registered users on the Firebase console-gitir
169-Registering a Facebook App-gitir
170-Enabling Facebook Sign In on Firebase-gitir
173-Adding the Facebook Sign In code-gitir
174-Testing Facebook Sign In on Android-gitir
175-Facebook iOS setup in Xcode-gitir
176-Testing Facebook Sign In on iOS-gitir
177-Accessing the user s data and privacy considerations-gitir
Section 11
Email & Password Sign-In + Handling Text Input
179-Preview of the email password sign in page-gitir
180-Creating the email password sign in page-gitir
181-Passing the BuildContext across methods-gitir
182-Introduction to navigation-gitir
183-Adding a Card widget-gitir
184-Adding the email and password text fields-gitir
185-Adding the submit buttons-gitir
186-Creating a FormSubmitButton widget-gitir
187-Adding a TextEditingController-gitir
188-Toggling the form type-gitir
189-Adding the email password authentication code-gitir
190-Implementing the submit method-gitir
191-Testing email password sign in-gitir
192-Customising the email and password text fields-gitir
193-Using FocusNode and FocusScope-gitir
194-Disabling the submit button on empty email or password-gitir
195-Adding a StringValidator class-gitir
196-Adding an email and password validation mixin-gitir
197-Showing an error text when the email or password are invalid-gitir
198-Tweaking form submission-gitir
199-Simulating a slow network with a delay-gitir
200-Adding a loading state to our form-gitir
201-Updating the email focus logic-gitir
202-Fixing the vertical overflow on small screens-gitir
203-Wrap up-gitir
Section 12
Platform-Aware Dialogs
205-Introduction to dialogs-gitir
206-Showing a dialog-gitir
207-Dismissing dialogs-gitir
208-Platform aware widgets on iOS Android more-gitir
Section 13
Scoped Access with InheritedWidget and Provider
213-Introduction to InheritedWidget-gitir
214-Creating an AuthProvider-gitir
215-Accessing the Auth object via the AuthProvider-gitir
216-Adding the provider package-gitir
217-Using the Provider class-gitir
218-Wrap up about scoped access-gitir
Section 14
Polishing the Authentication Flows
220-Module Introduction-gitir
224-Adding a loading state overview-gitir
225-Adding a loading state to the SignInPage-gitir
226-Using the loading state in the SignInPage-gitir
227-The dispose method-gitir
Section 15
BLoCs
228-Introduction to state management with BLoCs-gitir
229-The application layers-gitir
230-BLoCs sinks streams and asynchronous code-gitir
231-Introduction to the SignInBloc-gitir
232-Implementing a simple BLoC-gitir
233-Adding a Bloc with Provider inside a static method-gitir
234-Adding the StreamBuilder code-gitir
235-Converting the SignInPage to a stateless widget-gitir
236-The difference between Provider of and Consumer-gitir
237-Disposing BLoCs with Provider-gitir
238-Adding authentication code to the SignInBloc-gitir
239-Updating the SignInPage-gitir
240-Fixing the BLoC submit method-gitir
241-Summary on the BLoC basics-gitir
242-Introduction to the email sign in flow with BLoC-gitir
243-Creating a model class for the EmailSignInForm-gitir
244-Creating the EmailSignInBloc with a StreamController-gitir
245-Updating the model-gitir
246-Adding the BLoC submit method-gitir
247-Setting up the EmailSignInFormBlocBased with Provider-gitir
248-Refactoring the EmailSignInFormBlocBased widget by removing the state variables-gitir
249-Moving the business logic to the BLoC class-gitir
250-Moving more business logic to the model class-gitir
251-The benefits of separation of concerns with BLoC-gitir
252-Using stateful widgets with TextEditingControllers-gitir
253-Considerations about performance-gitir
254-Blocs and Services in the widget tree-gitir
Section 16
State Management with Provider
255-Recap on State Management-gitir
256-Introduction to ValueNotifier-gitir
257-Adding a ValueNotifier with ChangeNotifierProvider-gitir
258-Consumer and ChangeNotifierProvider explained-gitir
259-Differences between BLoC streams and ValueNotifier ChangeNotifierProvider-gitir
260-Introduction to ChangeNotifier-gitir
261-Adding the EmailSignInChangeModel class-gitir
262-Completing the EmailSignInChangeModel class-gitir
263-Implementing the email sign in form with ChangeNotifier-gitir
264-Comparing ValueNotifier and ChangeNotifier-gitir
265-Wrap up on State Management-gitir
266-Wrap up on the Authentication Flows-gitir
Section 17
Databases and Cloud Firestore
268-Overview of the time tracker app-gitir
269-Database schema and SQL vs NoSQL-gitir
270-Introduction to Cloud Firestore-gitir
271-Documents and Collections-gitir
272-Getting started with Firestore-gitir
273-Designing a Database API with CRUD operations-gitir
274-Managing private user data with Cloud Firestore-gitir
275-Installing Cloud Firestore-gitir
276-Renaming the HomePage to JobsPage-gitir
277-Adding the Database class-gitir
278-Adding the Database Provider-gitir
279-Adding a FloatingActionButton-gitir
280-Writing data to Firestore-gitir
281-Defining a strongly typed Job model class-gitir
282-Defining a common API path class-gitir
283-Adding a generic setData method-gitir
284-Adding security rules-gitir
285-Handling Firestore permissions errors-gitir
286-Reading data from Firestore-gitir
287-Reading and parsing Firestore data streams-gitir
288-Adding a StreamBuilder to show a list of jobs-gitir
289-Debugging the StreamBuilder code-gitir
290-Firestore as a realtime database-gitir
291-Adding a factory constructor to our model class-gitir
292-Adding a generic method to read Firestore streams-gitir
293-Adding a FirestoreService class-gitir
294-Wrap up on Cloud Firestore-gitir
Section 18
Working with Forms and Cloud Firestore
296-Introduction to Forms with Cloud Firestore-gitir
297-Adding a new job page-gitir
298-The Placeholder widget-gitir
299-Introduction to Form and TextFormField-gitir
300-Validating and saving Form data-gitir
301-Accessing the Database object with the correct BuildContext-gitir
302-Saving jobs with a unique document ID-gitir
303-Handling errors-gitir
304-Enforcing unique job names-gitir
305-Fixing the integer parsing code-gitir
306-Editing existing jobs overview-gitir
307-Adding a custom JobListTile-gitir
308-Repurposing the AddJobPage for editing jobs-gitir
309-Reading the documentID from Firestore-gitir
310-Completing the code for editing jobs-gitir
311-Wrap up on working with Forms-gitir
Section 19
Working with ListViews and multiple UI states
313-Intro and multiple states of UI-gitir
314-Adding an empty content widget-gitir
315-Adding a reusable list items builder-gitir
316-Using ListView builder-gitir
317-Using ListView separated-gitir
318-Deleting jobs from Firestore-gitir
319-Adding swipe to delete support-gitir
Section 20
Working with Date & Time Pickers, more on Cloud Firestore
320-Working with entries overview-gitir
321-Relational data drawbacks of NoSQL databases-gitir
322-Getting ready to add new files-gitir
323-Adding the source files to the project-gitir
324-Connecting the new code and updating the Firestore rules-gitir
325-Fixing the EditJobPage navigation-gitir
326-Overview of the JobEntriesPage-gitir
327-Reading and writing entries with Firestore-gitir
328-The EntryListItem widget using InkWell and Expanded-gitir
329-Formatting dates and currencies with the Intl package-gitir
330-Dart as UI Spreads and Collection if-gitir
331-Using date pickers with stateful widgets-gitir
332-Date and time input with a custom UI and DateTimePicker-gitir
333-Updating the UI when a Job changes-gitir
334-Wrap up and CupertinoDatePicker-gitir
Section 21
Bottom Navigation with the Cupertino widgets
336-Introduction to bottom navigation-gitir
337-Multiple navigation stacks-gitir
338-Creating a HomePage with a selected tab-gitir
339-Adding a CupertinoTabScaffold-gitir
340-Testing the bottom navigation-gitir
341-Adding the widget builders-gitir
342-Replacing the FloatingActionButtons-gitir
343-Moving the logout button to the AccountPage-gitir
344-Presenting modal routes with the root navigator-gitir
345-The CupertinoPageRoute-gitir
346-Handling the Android back button with WillPopScope and navigator keys-gitir
347-Adding pop to root navigation-gitir
348-Wrap up on multiple navigators-gitir
Section 22
Advanced Stream Operations with RxDart
350-Introduction to advanced stream operations-gitir
351-Introduction to RxDart-gitir
352-Observable combineLatest and data transformations in the time tracker app-gitir
353-Adding the source code for the new entries page-gitir
354-Reviewing the UI code for the entries page-gitir
355-Using combineLatest in practice-gitir
356-Data manipulation in the EntriesBloc-gitir
357-Wrap up on Observables-gitir
358-Single subscription vs broadcast streams-gitir
359-PublishSubject ReplaySubject BehaviorSubject-gitir
360-Adding a BehaviorSubject to the EmailSignInBloc-gitir
361-Wrap up and notes about local and remote state management-gitir
Section 23
Completing the Time Tracker App
363-Completing the time tracker app overview-gitir
364-Accessing the User object in the AccountPage-gitir
365-Adding an Avatar image-gitir
366-Finishing the Avatar code-gitir
367-Wrapping up the time tracker app-gitir
Section 24
Unit & Widget Tests with Mockito
368-Introduction to writing tests-gitir
369-Testing Flutter Apps-gitir
370-Writing the first unit test-gitir
371-Running tests-gitir
372-Checking and fixing errors in tests-gitir
373-Testing edge cases by writing and fixing failing tests-gitir
374-Grouping tests together-gitir
375-The setUp method and testing date formatting with locales-gitir
376-The test lifecycle methods-gitir
377-Completing the formatting tests-gitir
378-Testing model classes-gitir
379-hashCode and the operator-gitir
380-Adding a toString method wrap up on unit tests-gitir
381-Introduction to widget tests-gitir
382-Finding widgets and matcher arguments-gitir
383-Testing widget callbacks-gitir
384-Working with Acceptance Criteria-gitir
385-Introduction to test mocks and mockito-gitir
386-Injecting mock objects with Provider-gitir
387-Verifying mock methods-gitir
388-Working with keys entering text and the pump method-gitir
389-Testing widget updates on state changes-gitir
390-Completing the email sign in tests-gitir
391-Replacing Navigator pop with a callback when the user signs in-gitir
392-Updating the tests to handle the form callback-gitir
393-Stubbing mock objects-gitir
394-Recap on the email sign in forms and stubbing mocks-gitir
395-Using widget tests with StreamBuilder-gitir
396-Using StreamController inside tests-gitir
398-Test setup for the SignInPage-gitir
399-Adding keys to custom widget classes-gitir
400-Testing navigation-gitir
401-The great thing about widget tests-gitir
402-Testing ValueNotifier models-gitir
403-Testing ChangeNotifier models-gitir
404-Testing BloCs-gitir
405-Comparing EmailSignInModel objects-gitir
406-Testing streams in Blocs-gitir
407-Wrap up on unit widget tests-gitir
Section 25
Conclusion and Next Steps
410-Conclusion and Next Steps-gitir
Exercese
Instructors
Enrolment options
Flutter & Firebase Build a Complete App for iOS & Android
Course modified date:
13 Apr 2025
Enrolled students:
There are no students enrolled in this course.
Guests cannot access this course. Please log in.
Continue
Enrol now
This course includes
Resources
Share this course
Scroll to top
×
Close
×
Close