Careot est une application mobile de suivi diététique basée sur Flutter et Firebase.
Jetez un oeil à notre site pour une présentation de l'application ou à notre video https://youtu.be/09aPwHoQaI8
- đ„ Careot
Nous sommes une équipe motivées de 4 étudiants en derniÚre année de Bachelor. Nous sommes répartis en deux équipes:
- Team Frontend: Chloé & Luca
- Team Backend: Nelson & Olivier
Ce projet s'inscrit dans le cadre de la HES d'été à la HEIG-VD d'Yverdon en 2022, durant laquelle nous devons développer une application pendant une durée de 3 semaines.
Nous sommes en orientation logiciel sauf Olivier qui a optĂ© pour la science des donnĂ©es. Mais nous avons tous une chose en commun, nous aimons les crĂȘpes.
La nourriture occupe une place importante dans notre processus de dĂ©veloppement. L'idĂ©e de cette application a vu le jour Ă une crĂȘpe party L'aventure a ensuite commencĂ© autour d'une Babka. Il sera nĂ©cessaire de terminer avec une soirĂ©e crĂȘpe!
Vous trouverez la version Android de l'application dans la section release de Github.
Il est possible que dans le futur une version IOS soit disponible donc tenez vous au courant.
Guide d'installation Android
- Téléchargez le dernier APK sur votre téléphone.
- Autorisez votre explorateur de fichier ou autre application Ă installer des
.apk
depuis une source externe. - Puis lancez l'installation. đ
Si vous souhaitez build l'application vous-mĂȘmes, veuillez suivre les Ă©tapes ci-dessous:
- Installez Flutter
- Clonez notre repository
cd CAREOT_APP/
flutter pub get
Installer les dépendancesflutter packages pub run build_runner build --delete-conflicting-outputs
Nous utilisons le package Auto_route qui génÚre automatiquement des fichiers. Si vous souhaitez ne pas executer cette commande à chaque modification du code source, vous pouvez alors utiliser cette commande à la placeflutter packages pub run build_runner watch
flutter build apk --release
Build un apk en monde release
Si vous voulez contribuer Ă notre projet, il faudra effectuer un fork de notre repository et suivre les Ă©tapes ci-dessous:
- SĂ©lectionner le projet Github, prendre ou ajouter une tĂąche dans l'onglet TODO.
- Créer un issue dans le repository correspondant
- S'assigner à l'issue et ajouter les tags nécessaires (frontend, backend, bug, ehancement etc...)
- Créer une branche associée à l'issue (petit bouton dans issue: create branch)
- Charger la branche en local (copier la commande fournie par l'utilitaire)
- RĂ©aliser les modifications
- Lancer les tests en local ->
flutter test
- Lancer le linter ->
flutter analyze
- AprĂšs validation, push sur la nouvelle branche dans la remote origin.
- Créer une Pull Request et attendre un review d'un pair. Dans le cas ou vous avez oublié de procéder à l'étape 7 et/ou 8, la pull request sera impossible si les vérifications échouent.
- Supprimer la branche aprĂšs la fusion avec la branche principale (main)
Pour plus d'informations, vous pouvez consulter notre cahier des charge
Android Studio
Pour cacher les fichiers générés, rendez-vous dans Preferences
-> Editor
-> File Types
et collez la ligne ci-dessous dans ignore files and folders
:
*.g.dart;
Visual Studio Code
Rendez-vous dans Preferences
-> Settings
et chercher Ă l'aide de la barre de recherche Files:Exclude
. Puis ajoutez cette ligne:
**/*.g.dart
Nous utilisons Flutter pour l'application et trois services Firebase:
- Storage: afin de stocker les fichiers
- Authentication: afin d'authentifier nos utilisateurs
- Firestore: afin de stocker nos données au format NoSql
Voici la structure de fichiers que fournit flutter.
CAREOT_APP
âââ android
âââ assets
âââ build
âââ ios
âââ lib
âââ linux
âââ macos
âââ test
âââ web
âââ windows
Voici la structure de fichiers que nous avons mis en place.
/lib
âââ api
âââ model
âââ provider
âââ router
âââ screens
âââ scripts
âââ widgets
âââ buttons
âââ cards
âââ client_list
âââ diary
âââ forms
âââ login
âââ profile
âââ register
Plongeons maintenant plus en détail dans le dossier /lib qui contient le code principal de notre application.
1- api â Ce dossier contient les classes permettant de rĂ©cupĂ©rer les donnĂ©es venant de l'Ă©xtĂ©rieur(firebase).
2- model â Ce dossier contient les diffĂ©rents modĂšles que nous utilisons.
3- provider â Ce dossier contient nos provider. Ils contiennent la partie logique de l'app.
4- routerâââCe dossier contient l'arboressence de nos diffĂ©rents screens.
5- screensâââCe dossier contient les classes qui assemblent nos diffĂ©rents Ă©lĂ©ments graphique.
6- scriptsâââ
7- widgetsâââCe dossier contient tous les Ă©lĂ©ments graphiques.
8- main.dart - Le point d'entrée de notre application.
- firebase_core
- auto_route
- firebase_auth
- firebase_storage
- cloud_firestore
- firebase_database
- provider
- flutter_chat_ui
- table_calendar
- intl
- uuid
- image_picker
- cross_file_image
- day_night_time_picker
- google_nav_bar
- path_provider
- get_it
- firebase_auth_mocks
- firebase_storage_mocks
- file_picker
- file
- awesome_snackbar_content
- sorted_list
- async
- url_launcher
- tuple
- flutter_svg
- flutter_dotenv
- sticky_headers
Afin de respecter nos conventions de codage il faudra que les commandes ci-dessous n'Ă©chouent pas:
flutter analyze
flutter test
Afin de débuter avec le développement de flutter il faut se référer à la documentation en ligne, qui propose des conseils, les références API ainsi que des examples.
- Afin de travailler avec la base de donnée noSql: Documentation FireStore
- Afin de travailler avec le service d'identification: Documentation Authentication
- Afin de travailler avec les fichiers: Documentation Storage
Comme nous utilisons Firebase, nous n'avons pas d'API. Cependant, nous avons une structure similaire qui permet de traiter les données.
Afin de travailler sur les données (CRUD et autre), nous utilisons une interface par type de donnée qui nous permet de changer de services rapidement. Par exemple, nous avons une classe FirebaseMessage qui implémente l'interface IMessage. De cette maniÚre, si on utilisait un autre service, par exemple atlasDB nous pourrions créer la classe AtlasdbMessage.
Exemple pour utiliser l'API Firebase dans notre application.
IMessage messageApi = FirebaseMessage();
messageApi.createMessage();
messageApi.readMessage();
messageApi.updateMessage();
messageApi.deleteMessage();
messageApi.implementNewBadassFunctions(with, crazy, parameters);
...
Nous utilisons les providers pour séparer la logique de l'interface.