Aplicación Flutter de organización académica basada en un calendario matricial con arquitectura MVVM y Clean Architecture.
El proyecto implementa Clean Architecture con tres capas claramente separadas:
lib/
├── main.dart
├── core/ # Utilidades compartidas
└── features/
└── calendar/
├── domain/ # Capa de Dominio (Lógica de negocio)
│ ├── entities/ # Entidades de negocio
│ │ ├── subject.dart
│ │ ├── activity_type.dart
│ │ ├── event.dart
│ │ └── calendar_month.dart
│ ├── repositories/ # Interfaces de repositorios
│ │ └── calendar_repository.dart
│ └── usecases/ # Casos de uso
│ ├── get_all_subjects.dart
│ ├── update_event.dart
│ ├── delete_event.dart
│ └── initialize_default_subjects.dart
├── data/ # Capa de Datos (Implementación)
│ ├── models/ # DTOs y adaptadores Hive
│ │ ├── subject_model.dart
│ │ ├── activity_type_model.dart
│ │ └── event_model.dart
│ ├── datasources/ # Fuentes de datos
│ │ └── calendar_local_datasource.dart
│ └── repositories/ # Implementaciones de repositorios
│ └── calendar_repository_impl.dart
└── presentation/ # Capa de Presentación (UI)
├── providers/ # Gestión de estado con Riverpod
│ ├── calendar_providers.dart
│ └── calendar_notifier.dart
├── pages/ # Pantallas
│ └── calendar_page.dart
└── widgets/ # Componentes reutilizables
├── calendar_header.dart
├── subject_row.dart
└── cell_editor_dialog.dart
Subject (Materia)
id: Identificador úniconame: Nombre de la materiaactivityTypes: Lista de tipos de actividad
ActivityType (Tipo de Actividad)
name: deberes, talleres, labs, pruebas, proyectosevents: Mapa de día → contenido del evento
Event (Evento)
subjectId: Referencia a la materiaactivityType: Tipo de actividadday: Día del mescontent: Contenido del evento (ej: "Parcial", "Prueba P")
CalendarMonth (Mes del Calendario)
year,month: FechadaysInMonth: Cantidad de díasfirstWeekday: Día de inicio del mes
Patrón MVVM con Riverpod:
Gestiona el estado global del calendario:
- Carga inicial de materias
- Actualización de eventos
- Cambio de mes
- Manejo de errores
calendarLocalDataSourceProvider: Data sourcecalendarRepositoryProvider: RepositoriogetAllSubjectsProvider,updateEventProvider, etc.: Casos de usocalendarNotifierProvider: Estado global
Hive como base de datos local:
- Almacenamiento tipo clave-valor
- Adaptadores generados automáticamente
- Inicialización de 6 materias predeterminadas:
- Lectura y Escritura
- Sistemas Operativos
- Apps Basadas en Conocimiento
- Pruebas de Software
- Análisis y Diseño
- Apps Móviles
Cada materia tiene 5 tipos de actividades: deberes, talleres, labs, pruebas, proyectos.
- Sticky Header: Fila superior con días del mes
- Sticky Sidebar: Primera columna con materias y actividades
- Grid Editable: Celdas que permiten agregar/editar eventos
- Navegación: Botones para cambiar de mes
- Tabla con scroll horizontal y vertical
- Celdas de colores según tipo de evento:
- 🔴 Rojo: Parciales, Exámenes, Conjunta
- 🟡 Amarillo: Pruebas
- 🟣 Morado: Proyectos
- 🔵 Azul: Otros eventos
- Diálogo flotante para editar celdas
- Encabezados con formato "Lunes 8, Martes 9..."
- Clonar el repositorio
git clone <repository-url>
cd planif- Instalar dependencias
flutter pub get- Generar adaptadores de Hive
flutter pub run build_runner build --delete-conflicting-outputs- Ejecutar la aplicación
flutter runflutter_riverpod: ^2.6.1 - Gestión de estadohive: ^2.2.3 - Base de datos localhive_flutter: ^1.1.0 - Integración de Hive con Flutterhive_generator: ^2.0.1 - Generador de adaptadoresbuild_runner: ^2.4.13 - Generación de código
UI (CalendarPage)
↓ Interacción del usuario
CalendarNotifier (StateNotifier)
↓ Llama a casos de uso
UseCases (UpdateEvent, GetAllSubjects, etc.)
↓ Utiliza el repositorio
CalendarRepository (Interface)
↓ Implementación
CalendarRepositoryImpl
↓ Accede a datos
CalendarLocalDataSource (Hive)
↓ Persistencia
Base de Datos Local
- GetAllSubjects: Obtiene todas las materias con sus actividades
- UpdateEvent: Actualiza o crea un evento en una celda específica
- DeleteEvent: Elimina un evento de una celda
- InitializeDefaultSubjects: Crea las materias por defecto si no existen
- Tocar cualquier celda de la tabla
- Se abre un diálogo con el contenido actual (si existe)
- Escribir el nuevo contenido (ej: "Parcial")
- Guardar o eliminar el evento
- Usar los botones ← y → en el AppBar
- El calendario se regenera automáticamente
- Los eventos se mantienen persistentes
- Botón de refresh en el AppBar
- Los datos se recargan desde Hive
La arquitectura facilita el testing en todos los niveles:
- Unit tests: Casos de uso y lógica de negocio
- Widget tests: Componentes UI
- Integration tests: Flujo completo de la app
- Arquitectura escalable y modular
- Separación clara de responsabilidades
- Código limpio y mantenible
- Inyección de dependencias con Riverpod
- Mapeo bidireccional entre entidades y DTOs
- Gestión de estado reactivo
- Persistencia local sin internet
Esta aplicación permite a estudiantes organizar sus actividades académicas en un calendario visual tipo matriz, donde pueden:
- Ver todas sus materias en un solo lugar
- Registrar fechas de entregas, pruebas y proyectos
- Identificar rápidamente días con múltiples actividades
- Planificar su tiempo de estudio efectivamente