App móvil de seguimiento de hábitos con componente social: rachas, estadísticas, desafíos con amigos y recordatorios.
GrowTogether es una aplicación de seguimiento de hábitos con componente social, inspirada en Atomic Habits de James Clear: construye hábitos consistentes, visualiza tu progreso y compite con amigos en desafíos.
Es el Trabajo Final de Grado de DAM (Desarrollo de Aplicaciones Multiplataforma, 2025/2026) de Jordi Patuel Pons.
Este repo contiene la app móvil (Flutter) que usan los usuarios finales: hábitos con rachas, estadísticas con heatmaps, desafíos entre amigos, recordatorios locales, perfil personalizable y soporte de 3 idiomas. Consume la API REST a través del paquete compartido growtogether_data.
| Repositorio | Descripción |
|---|---|
| GrowTogetherAPI | Backend REST (Java 17 + Spring Boot) |
| GrowTogetherAPP ← estás aquí | App móvil de hábitos (Flutter) |
| GrowTogetherADMIN | Panel de administración web (Flutter Web) |
| GrowTogetherDATA | Paquete Dart compartido: modelos, cliente HTTP y repositorios |
| Capa | Tecnología |
|---|---|
| Framework | Flutter 3.38+ (Dart 3.10+) |
| State management | Provider 6.x (ChangeNotifier + MultiProvider) |
| Capa de datos | Paquete growtogether_data v0.5.0 (referenciado por git, compartido con el panel admin) |
| HTTP | Dio 5.x con interceptor JWT (vía growtogether_data) |
| Almacenamiento seguro | flutter_secure_storage 9.x (vía growtogether_data) |
| Conectividad | connectivity_plus 6.x (banner sin red) |
| Notificaciones locales | flutter_local_notifications 17.x + permission_handler 11.x |
| Imágenes | image_picker 1.x (cámara / galería) |
| Efectos visuales | confetti 0.7.x (celebración día completo) |
| i18n | Flutter ARB (es / en / ca) |
El código vive en el subdirectorio
growtogetherapp/del repo; ejecuta los comandos de Flutter desde ahí.
- Flutter SDK 3.38+ con Dart 3.10+ (instalación)
- Android Studio o VS Code con extensión Flutter
- Dispositivo Android (API 23+) o emulador
- GrowTogetherAPI corriendo en el puerto 8081 (ver su README)
Verifica la instalación:
flutter doctor# 1. Clona el repositorio
git clone https://github.com/devPatuel/GrowTogetherAPP.git
cd GrowTogetherAPP/growtogetherapp
# 2. Instala dependencias
flutter pub get
# 3. Genera los archivos de localización
flutter gen-l10nLa URL base de la API se inyecta en compile time vía --dart-define=API_URL=....
El main.dart la lee con ApiConfig.fromEnv(fallback: 'http://localhost:8081/api/v1'),
así que sin flag se usa el fallback de localhost.
| Escenario | Comando |
|---|---|
| Emulador Android | flutter run --dart-define=API_URL=http://10.0.2.2:8081/api/v1 |
| Dispositivo físico (USB + adb reverse) | adb reverse tcp:8081 tcp:8081 && flutter run |
| Dispositivo en LAN | flutter run --dart-define=API_URL=http://192.168.X.X:8081/api/v1 |
| Chrome (web) | flutter run -d chrome --dart-define=API_URL=http://localhost:8081/api/v1 |
# Listar dispositivos disponibles
flutter devices
# Lanzar en un dispositivo concreto
flutter run -d <device-id>
# Lanzar en Chrome (web)
flutter run -d chrome| Rol | Contraseña | |
|---|---|---|
| Admin | admin@growtogether.com | Prueba123 |
| Usuario estándar | usuario@growtogether.com | Prueba123 |
lib/
├── main.dart # MultiProvider + MaterialApp + bootstrap de repos
├── core/
│ ├── feedback/ # FeedbackController + FeedbackService (vibración + animaciones)
│ ├── l10n/ # Controlador de idioma (ValueNotifier)
│ ├── theme/ # 4 temas + controlador (ValueNotifier)
│ └── utils/ # Validadores, iconos de hábitos, colores de desafíos, snack helper, dashboard cache
├── providers/ # ChangeNotifiers (Auth, Habitos, DetalleHabito, Perfil, Statistics, Amistad, Desafios, Notificaciones, Connectivity, DetalleDesafio)
├── services/ # Servicios de capa OS (LocalNotificationsService sobre flutter_local_notifications)
├── screens/ # Pantallas
│ └── widgets/ # Widgets reutilizables (HeatmapCalendar, ProgressPainters, MultilineChart, etc.)
└── l10n/ # ARB generados por flutter gen-l10n
Los modelos, el cliente HTTP (Dio + interceptor JWT), el almacenamiento seguro y los repositorios viven en el paquete
growtogether_data(referenciado por git ref desde GitHub, verpubspec.yaml). Es el mismo paquete que consume el panel admin web, así garantizamos un único contrato con la API.
- Autenticación: registro, login, cierre de sesión, cambio de contraseña con invalidación de token
- Hábitos: crear, editar, eliminar, marcar/desmarcar por fecha, historial interactivo
- Hábitos PERSONALIZADO: soporte para días de la semana específicos (lunes, miércoles, viernes…)
- Rachas: cálculo de racha actual y máxima, diferenciado para hábitos diarios y personalizados
- Estadísticas: heatmap general + por hábito (16 semanas), récords de racha, métricas globales
- Perfil: foto de perfil (cámara/galería), editar nombre y email, 4 temas de color, 3 idiomas
- i18n: español, inglés y catalán con sincronización de preferencias en servidor
- Consejo del día: el dashboard muestra el consejo asignado a la fecha de hoy
desde la API (
GET /usuarios/consejo/hoy). Lo gestiona el panel admin, no está hardcoded. - Recordatorios locales: cada hábito puede tener un recordatorio que se programa
como notificación local con
flutter_local_notifications. La configuración vive en el backend; al login la app reprograma todas las alarmas según el hábito asociado (diario o días específicos). - Tolerancia a red: banner persistente cuando se pierde la conexión y caché
del dashboard (hábitos del día + consejo) en
SharedPreferences. Las acciones siguen requiriendo conexión, las lecturas se sirven del caché si la API falla.
| Nombre | Descripción |
|---|---|
| Claro | Fondo blanco, acentos rosa/lavanda |
| Oscuro | Fondo negro, acentos teal/cyan |
| Morado | Gradiente púrpura-azul, acentos naranja |
| Naturaleza | Gradiente verde-dorado, acentos tierra |
El tema e idioma se sincronizan con el servidor y se restauran en cada inicio de sesión.
flutter testCobertura actual: 42 tests entre unitarios y de widget. Cubren los 10 providers (Auth, Habitos, DetalleHabito, Perfil, Statistics, Amistad, Desafios, DetalleDesafio, Notificaciones, Connectivity), los validadores de formularios (Validators) y las pantallas de login y registro.
dart doc .Salida en doc/api/. Por defecto está incluida en .gitignore (quita la línea
**/doc/api/ si quieres versionarla o publicarla a GitHub Pages).
Las decisiones técnicas (Flutter vs React Native, Provider vs Bloc,
Navigator vs GoRouter, política offline, recordatorios locales…) están
documentadas en docs/DECISIONS.md. Las del
paquete de datos compartido viven en
GrowTogetherDATA/docs/DECISIONS.md
y las del backend en
GrowTogetherAPI/docs/DECISIONS.md.
Proyecto académico — Trabajo Final de Grado de DAM · GrowTogether · Jordi Patuel Pons.