https://github.com/avinandanbose/multistoreapp
This is a Multi Store Ecommerce App build on Dart and Flutter.
https://github.com/avinandanbose/multistoreapp
Last synced: 3 months ago
JSON representation
This is a Multi Store Ecommerce App build on Dart and Flutter.
- Host: GitHub
- URL: https://github.com/avinandanbose/multistoreapp
- Owner: AvinandanBose
- Created: 2022-10-02T14:30:34.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2022-11-25T06:00:42.000Z (almost 3 years ago)
- Last Synced: 2025-03-21T22:29:42.439Z (7 months ago)
- Size: 6.03 MB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# multistoreapp
This is a Multi Store Ecommerce App build on Dart and Flutter.A. Layout Design
-
1. First Update(Bottom Navigation Bar)
2. Second Update(Home Screen Design(1)[Before Refactoring])
3. Third Update(Home Screen Design(2)[After Refactoring, And Implementing Indicator])
4. Fourth Update(Search Bar)
5. Category Screen
- Refactor(Fake Search Widget(User Defined)) and Stack Widget(In-built from library) with Positioned children.
- Using MediaQuery and Adjusting Size Of Category Screen.
- Creation of Two User Defined Widgets :1) Categview 2) SideNavigator.
- Keeping MediaQuery To A Variable And Passing The Variable(Size Object[Stored in Material]) In Parameters Of Two User Defined Widgets :1) Categview 2) SideNavigator.
- 5 a) Side Navigator of Category Screen
- A simple UseCase of List View Builder in Flutter
- A simple UseCase of List View in Flutter
- A simple UseCase of List Tile in Flutter
- A simple UseCase of List View and List Tile in Flutter
- A simple UseCase of ListView.Builder and List Tile in Flutter
- Applying ListView.builder in our project.
- Using SizedBox in ListView.builder to have space between ITEMS and Center Widget to keep ITEMS in Center.
- Using List as Global and Calling It In ListView.builder .
- When List is a Class Type and Passing each element of List in ListView.builder through the help of a Class.
- In a big Sized Box taking a list of Containers through ListView.builder
- Activating color (White) when set to True for Each Container , While others remain false(Final)
- 5 b) Category View of Category Screen
- A Simple UseCase of PageView Widget and Scrolling Horizontally
- A Simple UseCase of PageView Widget and Scrolling Vertically
- Applying PageView Widget in Category View widget
- Applying PageController to Jump between Pages in PageView
- Applying Animation with Time Duration in PageController to Jump between Pages in PageView Widget
- Applying initState() to select the First Item when the Category widget Loads.
- 5 c) Grid View of Category Screen
- A Simple UseCase of ListView.Builder And List.generate
- A Simple UseCase of Column And List.generate
- A Simple UseCase of Row And List.generate
- A Simple UseCase of Row,Column,Container And List.generate With Some Design
- A Simple UseCase of Wrap Widget And List.generate
- A Simple UseCase of GridView.Builder widget
- A Simple UseCase of GridView.Count widget
- A Simple UseCase of GridView.Count and List.generate widget
- Applying GridView.Count and List.generate in our Project
- 5 d) Sub Category Products Screen
- Sub Category Products Screen
- 5 e)Adding Slider Bar
- A Simple UseCase of RotatedBox widget
- Adding Slider Bar
-
Out of Context - 5 f) Refactoring Code
- Refactoring Code(1)
- Refactoring Code(2)
- 5 g)Adding Category Screens
- Women Category Screen
- Shoes Category Screen
- Bags Category Screen
- Electronics Category Screen
- Accessories Category Screen
- Home And Garden Category Screen
- Kids Category Screen
- Beauty Category Screen
- 5 f)Fonts And AppBar Widgets
- A.Fonts
- B.AppBar Widgets
- AppBar Widgets(SubCategory of Minor Screen(1))
- AppBar Widgets(SubCategory of Minor Screen(2))
- Final Creation of AppBar Widgets file Under Widget Directory
- 5 g)Stores Screen
- Creation of Stores Screen
- 5 f)Cart Screen
- A Simple UseCase of BottomSheet Attribute of Scaffold widget
- Creation of Cart Screen(Applying Bottom Sheet Attribute)
- 5 g)Customer Profile Screen Part1
- A Simple UseCase of Custom Scroll View, Sliver App Bar, SliverToBoxAdaptar , ClipRRect,ClipRect, ClipPath and Clip Oval.
- A Simple UseCase of Sliver AppBar and Flexible Spacebar
- A Simple UseCase of BoxDecoration and Linear Gradient (Inside a Container)
- A Simple UseCase of TextButton
- A Simple UseCase of Fitted Box[Use for fitting A Widget inside A Widget especially Text]
- Creation of Customer Profile Screen Part1(Applying Custom Scroll View,Sliver App Bar,SliverToBoxAdaptar and Text Button )
- 5 h)Customer Profile Screen Part2
- Customer Profile Screen Part2 - I
- Customer Profile Screen Part2 - II (Refactoring)
- Customer Profile Screen Part2 - III (Refactoring)
- Customer Profile Screen Part2 - IV (Refactoring)
- Customer Profile Screen Part2 (Final)
- 5 i)Customer Profile Screen Part3
- Customer Profile Screen Part3 - I
- Customer Profile Screen Part3 - II
- Customer Profile Screen Part3 - Final Built
- 5 j)Supplier Home Screen
- Supplier Home Screen (Final Built)
- 5 j)a ) Dashboard Screen of Supplier Screen
- Dashboard Screen (part 1)
- Dashboard Screen (part 2)
- Dashboard Screen (Final Built)
- 5 k) Welcome Screen [mainscreen/welcomescreen]
- 5 k) a) → Welcome Screen Part 1
- Welcome Screen Part 1 → a
- Welcome Screen Part 1 → b (BoxConstraint.Expand())
- Welcome Screen Part 1 → c (SafeArea())
- Welcome Screen Part 1 → d (BoxDecoration)
- Welcome Screen Part 1 → e
- Welcome Screen Part 1 → f(Refactoring {mainscreen/cart})
- Welcome Screen Part 1 → g(Refactoring(2) {widgets/yellow_button})
- Welcome Screen Part 1 → h(importing yellow button in welcome screen})
- Welcome Screen Part 1 → (Final Built)
- 5 k) b) → Welcome Screen Part 2
- Welcome Screen Part 2 → a (Creating SignIn For Google/Facebook)
- Welcome Screen Part 2 → b(Refactoring)
- Welcome Screen Part 2 → c(Reshaping)
- Welcome Screen Part 2 → (Final Built)
- 5 k) c) → Welcome Screen Part 3[Animation]
- Welcome Screen Part 3[Animation]→ a
- Welcome Screen Part 3[Animation]→ b (Refactor)
- Welcome Screen Part 3[Animation]→ c (Animated Text Kit-Package Implementation)
- Welcome Screen Part 3[Animation]→ d (Animated Text Kit-Package Implementation-2)
- Welcome Screen Part 3[Animation]→ e (Refactor 2)
- Welcome Screen Part 3[Animation]→ f (Adding Additional Animated Texts)
- Welcome Screen Part 3 → (Final Built)
- 5 l) Navigation
- 5 l) a) Navigator.push vs Navigator.pushReplacement(mainscreen/welcomescreen)
- Navigator.push
- Navigator.pushReplacement
- 5 l) a) Navigator.pushReplacementNamed
- Navigator.pushReplacementNamed (main and mainscreen/welcomescreen - Supplier)
- Navigator.pushReplacementNamed (main and mainscreen/welcomescreen - Customer)
- Navigator.pushReplacementNamed ( mainscreen/profile)
- Navigator.pushReplacementNamed ( mainscreen/dashboard)
- Navigation
- 5 m) Adding Dashboard Screens [Problem]
- Creating Six Screens For Dashboard (lib/dashboard_components)
- Dashboard Problem (lib/dashboard_components & mainscreen/dashboard)
- 5 n) Adding Dashboard Screens [Solution]
- 5 o) AddingCustomer Screens [Cart Problem]
- AddingCustomer Screens (lib/customer_screens)
- Navigate To Customer Screens (main_screen/profile)
- Solving Resolution Problem (main_screen/cart)
- Adding Back Button To Cart Screen (main_screen/cart)
- Changing from Navigator.PushReplacement to Navigator.PushReplacementNamed (main_screen/cart)
- 5 p) Navigating To Cart Screen [Solution]
- Navigating To Cart Screen [Solution]-1 (mainscreen/cart and mainscreen/profile)
- Navigating To Cart Screen [Solution]-2 (mainscreen/cart )[Final]
- 1. Authentication Form Design
- Authentication Form Design → a
- Authentication Form Design → (FInal)
- 2.Refactor
- Refactor → a
- Refactor → (Final)
- 3.Show / Hide Password Typing
- Show / Hide Password Typing (Final)
- 4.Text Form Field Validation
- Text Form Field Validation (Final)
- 5.Regular Expression(RegExp) for Email Validation
- RegExp → a
- RegExp → Final
- 6.Saving Data Into Variables[So that the Variables Can Carry Data & Retrieve Data To/From Database]
- 1. Text Editing Controllers
- Text Editing Controller → Final
- 2. OnChanged of TextFormField
- OnChanged of TextFormField → Final
- 7. SnackBar Class( Messenger of Scaffold)
- SnackBar → a
- SnackBar → b [ScaffoldMesengerKey, ScaffoldMessengerState]
- SnackBar → c [Encapsulating ShowSnackBar Func With A Class ](1)
- SnackBar → d [Encapsulating ShowSnackBar Func With A Class ](2)
- SnackBar → e [Designing the SnackBar]
- SnackBar → Final
- 8. Image Picker [Dependency Package]
- 1. Include In Pubspec.yml file of the Project.
- 2. Give Access To The Device .
- Make → android:requestLegacyExternalStorage="true" in AndroidManifest.xml (Dir: app/src/main/AndroidManifest.xml) .
- 3. Accessing Image From Camera .
- Accessing Image From Camera→ a
- Accessing Image From Camera[Error Handling{Wrapping with Try Catch}]→ Final
- 4. Accessing Image From Gallery .
- Accessing Image From Gallery→ A
- Accessing Image From Gallery[Creating an Object of ImagePicker Class]→ Final
- 5. Viewing the Selected Image from Gallery/Camera .
- Viewing the Selected Image from Gallery/Camera→ Final
- 6. Showing Message If Image Not Selected .
- Showing Message If Image Not Selected→ Final
- 7. Auto Reset After SignUp .
- Auto Reset After SignUp → Final
- 9. Create Firebase Project
- 1.Creation of Firebase A/C and Linking with Flutter
- 2. Error Fixing
- 2.a. Error Fixing: MultiDex Issue and MinSDK
- 2.b. Error Fixing: Only For MinSDK Problem
- 3. Adding SHA certificate to Project Setting
- Adding SHA certificate to Project Setting
- 4. Installing Packages to use FireBase
- FireBaseAuth → A Flutter plugin to use the Firebase Authentication API.
- Cloud Firestore →A Flutter plugin to use the Cloud Firestore API.
- Firebase Storage(Cloud Storage for Flutter) →A Flutter plugin to use the Firebase Cloud Storage API.
- Firebase Core→A Flutter plugin to use the Firebase Core API, which enables connecting to multiple Firebase apps.
- 5. Initialization of Firebase in Project
- Initialization of Firebase in Project → Final
- 10. LogIn Anonymously
- 1. Go To Console
- 2. Go To Build → Authentication
- 3. Tap on Anonymous .
- 4. Turn on Anonymous and Save .
- 5. Log In Anonymously using If..{} else...{} Statement .
- Log In Anonymously using If..{} else...{} Statement
- 6. Log In Anonymously using If else Statement Type2.
- Log In Anonymously using If else Statement(2)
- 7. Log In Anonymously using Conditional Operator.
- Log In Anonymously using Conditional Operator
- 11. Log Out with Alert Dialogue
- 1. Log Out with Alert Dialog and ShowDialog
- Log Out using Alert Dialog and ShowDialog-1
- Log Out using Alert Dialog and ShowDialog-2[Solving Back Button Problem]
- Log Out using Alert Dialog and ShowDialog[Refactored][Final]
- 2. Log Out using Cupertino Alert Dialog and ShowCupertinoDialog
- Log Out using Cupertino Alert Dialog and ShowCupertinoDialog[Refactored][1]
- Log Out using Cupertino Alert Dialog and ShowCupertinoDialog[Refactored][Final]
- 12.SignUp
- 1. Go to Firebase Console
- 2. Then Go to Authentication
- 3. Then Go to SignIn Methods.
- 4. Then Go to Email and Password Section and Turn it on and save.
- 5. Now we have both active 1) Anynomous Sign In and 2) Email and Password SignIn.
- 6.SignUp .
- SignUp [FInal]
- 13.Uploading Customer Info
- 1. Create Cloud FireStore Database.
- 2. Start Firebase Storage Service .
- 3. Use the Rule for FireStore Database & Firebase Storage Service .
- 4.Uploading Customer Info .
- Uploading Customer Info [Final]
- 14. Adding Loading Indicator.
- Adding Loading Indicator [Final]
- 15. Login.
- Login [Final]
- 16.Previewing Customer Info. In His Profile.
- Previewing Customer Info. In His Profile[Final]
- 17.Supplier's Authentication.
- Supplier's Authentication[Final]
- 18. Anonymous User info. [ Solution ].
- Anonymous User info. [ Solution ]→ Final
```Syntax
mainscreen/customer_home
```
```Syntax
mainscreen/home
```
```Syntax
mainscreen/home
```
```Syntax
mainscreen/home & minor_screens/search
```
```Syntax
[Widget Call : mainscreen/home] &
mainscreen/category[Stack and Positioned Child]
& widgets/fake_search
```
```Syntax
mainscreen/category
```
```Syntax
mainscreen/category
```
```Syntax
mainscreen/category
```
Now coming back to Project
```Syntax
mainscreen/category → SideNavigator
```
```Syntax
mainscreen/category → SideNavigator
```
```Syntax
mainscreen/category
```
```Syntax
mainscreen/category
```
```Syntax
mainscreen/category
```
```Syntax
mainscreen/category → SideNavigator
```
Now coming back to Project
```Syntax
mainscreen/category → CategView
```
```Syntax
mainscreen/category → SideNavigator & CategView
```
```Syntax
mainscreen/category → SideNavigator
```
```Syntax
mainscreen/category
```
Grid Widget in Flutter
Now coming back to Project
```Syntax
[Widget Call : main_screen/category] & categories/men_category
```
```Syntax
[Widget Call : categories/men_category] & minor_screens/sub_category
```
Now coming back to Project
```Syntax
categories/men_category
```
```Syntax
categories/men_category
```
```Syntax
[Widget Call : categories/men_category ] & widgets/categ_widgets
```
```Syntax
[Widget Call : main_screen/category] & categories/women_category
```
```Syntax
[Widget Call : main_screen/category] & categories/shoes_category
```
```Syntax
[Widget Call : main_screen/category] & categories/bags_category
```
```Syntax
[Widget Call : main_screen/category] & categories/electronics_category
```
```Syntax
[Widget Call : main_screen/category] & categories/accessories_category
```
```Syntax
[Widget Call : main_screen/category] & categories/homegarden_category
```
```Syntax
[Widget Call : main_screen/category] & categories/kids_category
```
```Syntax
[Widget Call : main_screen/category] & categories/beauty
```
```Syntax
minor_screens/sub_category
```
```Syntax
minor_screens/sub_category
```
```Syntax
[Widget Call : minor_screens/sub_category] & widgets/appbar_widgets
```
```Syntax
[Widget Call : main_screen/customer_home] & main_screen/stores
```
Now coming back to Project
```Syntax
[Widget Call : main_screen/customer_home] & main_screen/cart
```
Now coming back to Project
```Syntax
[Widget Call : main_screen/customer_home] & main_screen/profile
```
```Syntax
main_screen/profile
```
```Syntax
main_screen/profile
```
```Syntax
main_screen/profile
```
```Syntax
main_screen/profile
```
Final Built
```Syntax
main_screen/profile
```
```Syntax
main_screen/profile
```
```Syntax
main_screen/profile
```
Final Built
```Syntax
main_screen/profile
```
```Syntax
main_screen/supplierhomescreen
```
```Syntax
[Widget Call : main_screen/supplierhomescreen] &
main_screen/dashboard
```
```Syntax
main_screen/dashboard
```
Final Built
```Syntax
main_screen/dashboard
```
Final Built of Part 1
Final Built of Part 2
Final Built of Part 3
v/s
Note : Navigator.push remembers the previous page(i.e. doesnot dispose off the previous route) and provides extra back button to go back (to the previous route)but Navigator.pushReplacement replaces the current page with a new(dispose off the previous route and then enters the new route) and hence there is no back button to go back to the previous page.
Final Built
Note : Push and Replacement with Push occur in similar way but 'Named' creates a Mapping between a 'Name (Key)' and 'Route (Value)' pair. And whenever we trigger the 'Name' , it pushes to the corresponding 'Route' to which it is paired. And each Name is unique .
Note : Navigator.canPop → checks whether the Widget have pop() functionality , if it has then it returns true , else false. Note in the project AppBarBackButton() widget in profile have pop functionality .
Final Built
👇
B. Firebase Authentication[Level 1]
```Syntax
PushToPage : main_screen/welcome_screen
NamedCall : main
PageCreated : auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
refactor call: widgets/auth_widgets
```
```Syntax
auth/customer_signIn
widgets/auth_widgets → inputDecoration
```
```Syntax
auth/customer_signIn
```
Note : Without the Form Key we cannot check the Form Validation and Using the Key we have to check the Current State is Validated / Not Validated.
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
moved: widgets/auth_widgets → EmailValidator
```
Note :
```Syntax
Reg Exp (Works On Strings):
UserName's Part
------------------------
r → Start of Expression
^ → Start of string
' ' → String enclosure(Also can proceed with " ")
$ → End of Expression(String)
So, 1st we will check : r'^[exp] +$' where exp→ Expression
[a-zA-Z0-9] → Will check between a to z ,A to Z and 0 to 9 if it finds returns
true (Valid Expression) i.e. r'^[a-zA-Z0-9] +$'
[\-\_\.] → \ stands for ' At End of A String' , it will then finds its match
at end of a String with -(Hyphen) _ (Underscore) .(period)
i.e. Eg: good. or good_ or good-
Now:
[a-zA-Z0-9]+[\-\_\.][a-zA-Z0-9] : Eg→ AviBose_100 where + stand for 'Matches one or more'
* → It can occur Zero times to N number of times
Which makes a part optional , Now an email can be : BoseAvi_100 or BoseAvi Only before @
Hence we can do is:
[\-\_\.]* → -,_,. are now Optional
Also,
[a-zA-Z0-9]* → Makes a-z,A-Z,0-9 optional
Now,
DoMain Name 's part
--------------------------
i.e. It can be gmail / outlook/ ymail etc. and it cannot be less than 2 Hence.
[a-zA-Z]{2,} → i.e It must be 2 i.e. Start with 2 character.
Extension's Part
-------------------
Now Domain Name always ends with [.] and its not Optional.
[a-zA-Z]{2,}+[\.]
Extensions are : .in , .com etc. i.e. Starts with 2 character and Not more than 3.
Hence :
[\.][a-zA-Z]{2,3}
Now Full Expression we get:
RegExp(r'^[a-zA-Z0-9]+[\-\_\.]*[a-zA-Z0-9]*[@]+[a-zA-Z0-9]{2,}+[\.][a-zA-Z]{2,3}+$')
Now, the expression will throw error .
To overcome the error we have to priortize the parts:
([a-zA-Z0-9]+[\-\_\.]*[a-zA-Z0-9]*[@]+[a-zA-Z0-9]{2,}) - 1st Part When finished
then it looks for : [\.][a-zA-Z]{2,3}
Hence again Whole Expression must be closed with another Brace.
Final(1): RegExp(r'^(([a-zA-Z0-9]+[\-\_\.]*[a-zA-Z0-9]*[@]+[a-zA-Z0-9]{2,})+[\.][a-zA-Z]{2,3})+$')
Note: We can also use here ? instead of *
? → zero or one (optional)
Final(2): RegExp(r'^(([a-zA-Z0-9]+[\-\_\.]?[a-zA-Z0-9]?[@]+[a-zA-Z0-9]{2,})+[\.][a-zA-Z]{2,3})+$')
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
Note : Try to keep Variables as Private , in Dart Starting with '_' (Underscore ) means Private. [Data Hiding Concept of OOP]
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
Note : Snackbar can be called more than Once , And this can be done with a Key provided by Scaffold Messenger and Key's Current State can be null when nothing is called , hence we must give null check (!) after calling Key's current State.
```Syntax
auth/customer_signIn
```
Note : Here we call ShowSnackBar Func By Creation of Class's Object.
```Syntax
auth/customer_signIn
```
Note : Here ShowSnackBar Func accessed directly making the ShowSnackBar Func static eliminating the need for the creation of Object of the Class.
```Syntax
auth/customer_signIn
```
```Syntax
widgets/snackbar
Widget Call: auth/customer_signIn
```

Note : Starting with version 0.8.1 It is no longer required to add android:requestLegacyExternalStorage="true" as an attribute to the tag in AndroidManifest.xml
```Syntax
auth/customer_signIn
```
Note : XFile type used here by ImagePicker package is called CrossFile for Cross Platform (can be used for multiple platforms(like : Windows, Android , iOS)) and It wraps the bytes of a selected file, and its (platform-dependant) path.
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
```Syntax
auth/customer_signIn
```
Note:
```Syntax
Note: GlobalKey().currentState!.reset() → Reset Form
Or: GlobalKey key = GlobalKey(); & key.currentState!.reset()
Where , key is the Object of GlobalKey
Similarly: XFile? image = XFile('');
Where: '' → blank path
XFile? pickedImage = ImagePicker().pickImage(source: ImageSource.camera);
setState((){
image = pickedImage;
// Assigning blank path with the Source path of Camera
});
Now Again:
setState((){
image = pickedImage;
imageFile = null ; //Sets the path to blank again.
});
Note: Starting ,XFile? image = XFile(''); Will cause error as the path is blank.
Hence it is recommended that we must continue without assignment.
i.e.
XFile? image;
```
OR [Only for MinSDK Problem]
Note :
```Syntax
It is necessary for Firebase to authenticate Client
while storing Data either in Firestore Database or
Firebase Storage.Such Client Authentication done with
storing the SHA Key which get matched
between Server & Client ,during the process of
storing the data.
```
Note: Firebase Authentication aims to make building secure authentication systems easy, while improving the sign-in and onboarding experience for end users. It provides an end-to-end identity solution, supporting email and password accounts, phone auth, and Google, Twitter, Facebook, and GitHub login, and more.
Link For FireBase Auth Package
Note: Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud. Like Firebase Realtime Database, it keeps your data in sync across client apps through realtime listeners and offers offline support for mobile and web so you can build responsive apps that work regardless of network latency or Internet connectivity. Cloud Firestore also offers seamless integration with other Firebase and Google Cloud products, including Cloud Functions.
Link For Cloud FireStore Package
Note: Cloud Storage for Firebase is built for app developers who need to store and serve user-generated content, such as photos or videos. It helps to upload and download user-generated content through generating a link regarding the file . Some benefits of using Firebase Storage are : 1) Uploads and Downloads can takes place, regardless of network quality, 2) Strong Security and 3) High Scalability .
Link For Cloud FirebaseStorage Package
Link For Firebase Core Package
In pubspec.yaml install the dependencies:

```Syntax
main
```
Note
```Syntax
Note: WidgetsFlutterBinding → A concrete binding for applications based
on the Widgets framework.
WidgetsFlutterBinding.ensureInitialized() → Returns an instance of the
binding that implements WidgetsBinding.
If no binding has yet been initialized, the WidgetsFlutterBinding class
is used to create and initialize one.
As we are initilizing Firebase with Main() function ,
Response may come late i.e. asynchronous.
Hence, Main() function becomes async and it awaits for an
instance of Firebase and
Firebase.initializeApp() → Help to Initilize the App.
```



```Syntax
main_screen\welcome_screen
```
Note : ... [triple dot] is called Spread Operator , a concise way to insert multiple elements into a collection. Note here we can also use if...[ ] else...[ ] that will take all the collection and add into the list while if...{} else...{} to a map.
```Syntax
main_screen\welcome_screen
```
```Syntax
main_screen\welcome_screen
```
Note : Conditional Operator is the most accepted , since it reduces the lines of code and its simplicity.
An Use Case of Alert and ShowDialog
An Use Case of CupertinoAlert and ShowCupertinoDialog
```Syntax
main_screen\profile
```
```Syntax
main_screen\profile
```
```Syntax
main_screen\profile
```
```Syntax
main_screen\profile
```
```Syntax
Widget : widgets/alert_dialog
Widget Call: main_screen\profile
```
Note : In Logout before pushing to other page , it is necessary to get sign out from firebase instance created during signin .



```Syntax
auth\customer_signIn
```

```Syntax
auth\customer_signIn
```
Note :Email can be used for the name of Image in Firebase storage as it is unique for everybody.
```Syntax
auth\customer_signIn
```
```Syntax
NamedPush: main
WidgetCall: main_screen\welcome_screen
WidgetCall: auth\customer_signIn
auth\customer_login
```
```Syntax
WidgetCall: main_screen\customer_home
main_screen\profile
CircularProgressIndicator
_________________________________
color: auth\customer_signIn
color: auth\customer_login
color: main_screen\profile
```
```Syntax
auth\supplier_signup
auth\csupplier_login
Named Route: main
WidgetCall: main_screen\welcome_screen
Some Changes : auth\customer_signIn
```
```Syntax
main_screen\profile
main_screen\welcome_screen
```
Final Built
👇