A simple flutter starter with firebase And getX
Flutter starter
GetX simplify & optimise a lot how to use Flutter!
You should read a bit about GetX and Firebase.
Package used
- Firebase (firebase_core, firebase_auth, cloud_firestore)
- GetX
- get_storage
- crypto
- http
- csv (Use to convert csv of google excel translations)
External resources
Commons commands
flutter run
will run the app on a device. (It will ask which devices if you got few)flutter devices
will show you your devices list.flutter run -d {device}
will run on the chosen device.flutter build {web | ios | android}
will build the app for the chosen platform.flutter run --release
will let you test an optimized build (Like the release).
Translations
You can run a commandline app to generate the GetX Localization class which pulls from a google sheet
- Go to
/helpers/update_localizations.dart
- Run with
dart update_localizations.dart
Firebase
It’s currently link to a test one on mine (To make your test rapidly of that Repo #imSoNice) but if make sure you setup firebase with your project to continue your development.
There should be things to replace: (When you will setup your proper firebase)
- A file for IOS (
/ios/Runner/GoogleService-Info.plist
) - A file for Android (
/android/app/google-services.json
) - Credentials to replace for web. (In
/web/index.html
)
The rules in Firestore for this project are fairly simple. Here are the rules -created.
-
The first rule matches any user in the admin collection and allows you to read that document only. No one is allowed to write to this collection. I manually add my admin users through the firebase console.
-
The second rule allows the user to read and write only if the user matches the currently logged in user. So a user can only change information about themselves. Here is how my collections are setup in Firestore.
Themes
Use as far as you can the themes.
TODO: There is more to add here
Overview of the project
main.dart — contains info for maintaining the state of the app for the theme, language and user. It initializes language and theme settings. Sets up routing.
/constants/
Tips: Try to use & edit app_themes constants as more as you can.
app_themes.dart — contains info related to our light and dark themes.
globals.dart — contains some global app settings
app_routes.dart — contains the app routes.
/controllers/
Tips: The controllers are contains a lot of logic and think it a way to be reusable!
auth_controller.dart — our user and authentication functions for creating, logging in and out our user and saving our user data.
language_controller.dart — saves and loads our selected language.
theme_controller.dart — saves and loads our selected theme.
/helpers/
Tips: The google excel way is sooo nice. Use that update_localizations script!
validator.dart — contains some validation functions for our form fields.
update_localizations.dart — command line dart app that generates the localization.g.dart file.
localizations.g.dart — this file is generated from our google sheet (do not manually edit this file).
/models/
user_model.dart — contains the model for our user saved in Firestore.
menu_option_model.dart — contains our model for our language options and theme options in settings.
/screens/
Tips:
- Screens should use components and add max-width, margin & spacing between them.
- The screens file name should has similar name if not a exact name as the url & className should be like
NameScreen
.
home.dart — contains the ui for the home which shows info about the user.
settings.dart — contains the settings screen for setting the theme and language and some user settings.
splash.dart — contains the initial loading screen, currently just a circular progress indicator.
/screens/auth/
Tips: If there is a lot of screen that share a common purpose, group them in a folder.
reset-password.dart — sends a password reset email to the user.
sign-in.dart — allows user to login with email and password.
sign-up.dart — allows user to create a new account.
update-profile.dart — allows user to change his email or name.
/components/
Tips: The components should NOT have a max-width, margin/padding most of the time!
I mean except for the components with that purpose like the Section.
section.dart — Add a padding(left/right) and max-width for a section. Imagine (Layout -> Section -> Content/Components)
avatar.dart — displays a user avatar on the home.
dropdown_picker.dart — shows a dropdown list.
dropdown_picker_with_icon.dart — shows a dropdown list with icons.
form_input_field.dart — handles our form field elements.
form_input_field_with_icon.dart — handles our form field elements but has an icon too.
vertical_spacing.dart — just a space in the ui.
label_button.dart — one type of button in ui.
loading.dart — circular loading indicator overlay.
logo_graphic_header.dart — a graphic displayed in our ui.
primary_button.dart — another button in the ui.
segmented_selector.dart — a control used to select the theme.