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
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.