Unitime is a cross-platform Flutter mobile application designed as a unified platform for university students to manage their academic life, including class schedules, appointments, student groups, and promotional events.
A short screen recording demonstrating core flows is included in the repository as Unitime_screen_recording.mp4.
Embedded demo (click the image to open on YouTube):
Fallback link: https://youtube.com/shorts/l5Bsi4z_IQs
Note: GitHub may sanitize or block iframes in README views; the clickable thumbnail works reliably. To view locally:
# Linux
xdg-open Unitime_screen_recording.mp4
# macOS
open Unitime_screen_recording.mp4This application demonstrates production-ready software architecture and advanced Flutter development practices. The project implements a scalable MVVM architecture with clear separation of concerns, custom design patterns, and secure authentication mechanisms.
- Calendar Management — Multi-view calendar system (Month, Week, Day, Schedule) with recurrence rule support and color-coded appointment types
- Appointment Management — Create, edit, delete, and view class schedules, TDs, TPs, and special events
- Student Groups — Join and manage student groups with access codes
- Academic Promotions — Browse and manage campus promotions and promotional events
- User Authentication — Secure JWT-based authentication with platform-specific secure token storage
- Multi-Platform Support — Deploy across Android, iOS, Web, Windows, and macOS
- Theme Customization — Dark/Light/System mode support with Material Design 3
- User Profiles & Settings — Manage user information, preferences, and language selection
- MVVM Architecture — Established a scalable structure with clear separation across UI, ViewModel, Repository, and Service layers, enabling maintainability and minimal coupling between components
- Custom Result Type — Implemented a discriminated union pattern (Result<Ok, Error>) for type-safe error handling throughout the data layer, eliminating null checks and exception-based control flow
- Command Pattern — Created a reusable async operation wrapper with state tracking (running, completed, error), enabling reactive UI updates and preventing concurrent execution issues
- Singleton Pattern — Used for repositories and services to maintain consistent state across the application
- Multi-View Calendar System — Integrated Syncfusion Flutter Calendar with custom appointment rendering across four view modes (Month, Week, Day, Schedule), supporting recurrence rules and flexible time slot customization
- Custom Data Source Adapter — Developed
UniAppointmentDataSourcethat bridges the Syncfusion calendar widget with the application's data model, enabling real-time synchronization with color-coded appointment types (Courses, TDs, TPs, Special Events) - Dynamic Appointment Rendering — Current time indicators, appointment duration display, and responsive view transitions
- JWT Token Management — Engineered a JWT-based authentication system leveraging
flutter_secure_storagefor platform-specific secure credential persistence (Keychain on iOS, Keystore on Android) - Token Expiration Validation — Implemented automated token expiration checking through JwtService, ensuring timely user re-authentication
- Secure HTTP Communication — Bearer token authorization in all protected API endpoints with proper error handling
- RESTful Backend Integration — Connected to HTTP API with endpoints for authentication, appointments (CRUD), user profiles, groups, and promotions
- Type-Safe Data Serialization — Implemented JSON serialization/deserialization with factory constructors and pattern matching for safe data transformation between API responses and application models
- Immutable Data Structures — Used UnmodifiableListView for safe state exposure and prevented unintended external modifications
- ChangeNotifier-Based ViewModels — Implemented reactive state management enabling automatic UI rebuilds when data changes with efficient widget re-rendering
- Riverpod Integration — Included flutter_riverpod as a dependency, positioning the project for future refactoring toward advanced provider-based patterns
- Command State Tracking — Operations expose running, completed, and error states for UI feedback (loading indicators, error messages)
- Onboarding Flow — Developed multi-step first-time user setup with promotion and group selection screens for streamlined initial experience
- Reusable UI Components — Built maintainable component library (CurrentEventWidget, ThemeSwitcher, UserProfileWidget, CustomListTile) enforcing design consistency
- Multi-Theme Support — Implemented Material Design 3 with Dark/Light/System modes, allowing user customization
- Responsive Design — Adaptive layouts supporting deployment across mobile, tablet, and desktop platforms
- Modular Architecture — Organized 44+ Dart files across logical modules (data, service, repository, viewmodels, ui, core) for easy navigation and feature isolation
- Clear File Structure — Intuitive folder hierarchy making the codebase immediately understandable to new team members
- Framework: Flutter (SDK ^3.8.1) with Dart
- State Management: ChangeNotifier + Custom Command Pattern (flutter_riverpod for potential expansion)
- UI Components: Syncfusion Flutter Calendar v31.2.4, Material Design 3
- Authentication: JWT with flutter_secure_storage v9.2.4
- Networking: http v1.5.0 with Bearer token authorization
- Utilities: jwt_decoder v2.0.1, intl v0.20.2 for internationalization
- Backend: HTTP API on localhost:8080
- Flutter stable channel (install here)
- Android SDK for Android builds
- Xcode for iOS builds (macOS only)
Clone and install dependencies:
git clone <your-repo-url>
cd Unitime
flutter pub getRun on a connected device or emulator:
flutter runTo run on a specific device:
flutter devices
flutter run -d <device-id>Android:
flutter build apk --releaseiOS:
flutter build ipalib/
├── main.dart # App entry point & navigation
├── data/ # Data models & entities
│ ├── user.dart
│ ├── group.dart
│ ├── promotion.dart
│ ├── uni_appointment.dart
│ └── uni_appointment_data_source.dart
├── service/ # API & storage services
│ ├── authentication_service.dart
│ ├── user_service.dart
│ ├── uni_appointment_service.dart
│ ├── group_service.dart
│ ├── promotion_service.dart
│ ├── jwt_service.dart
│ └── storage_service.dart
├── repository/ # Data access abstraction
│ ├── authentication_repository.dart
│ ├── user_repository.dart
│ ├── uni_appointment_repository.dart
│ ├── group_repository.dart
│ ├── promotion_repository.dart
│ └── jwt_repository.dart
├── viewmodels/ # Presentation logic & state
│ ├── calendar_view_model.dart
│ └── feed_view_model.dart
├── ui/ # UI screens
│ ├── calendar_view.dart
│ ├── feed_view.dart
│ ├── profile_view.dart
│ ├── updates_view.dart
│ └── authentication/
│ ├── login_view.dart
│ └── register_view.dart
└── core/ # Utilities & constants
├── utils/
│ ├── result.dart # Result type for error handling
│ ├── command.dart # Async operation wrapper
│ └── exceptions.dart # Custom exceptions
├── constants/ # App constants & colors
└── widgets/ # Reusable components
The application communicates with a backend HTTP API:
Authentication:
POST /api/authentication/login
POST /api/authentication/register
Appointments:
GET /api/appointments/get
GET /api/appointments/currentAppointments
POST /api/appointments/create
DELETE /api/appointments/delete
Users:
GET /api/users/me
PUT /api/users/edit
Groups:
POST /api/groups/create
POST /api/groups/get
Promotions:
POST /api/promotions/get
POST /api/promotions/create
DELETE /api/promotions/delete
- Production-Ready Architecture — Scalable, maintainable software design with clean separation of concerns
- Advanced Design Patterns — Custom Result types, Command pattern, and Singleton pattern implementation
- Security Best Practices — Platform-specific secure storage and JWT token management
- Cross-Platform Development — Single codebase targeting multiple platforms
- Reactive Programming — ChangeNotifier and reactive UI paradigms
- Third-Party Integration — Effective integration of complex libraries (Syncfusion Calendar)
- User-Centered Design — Thoughtful features including onboarding flows, theme customization, and comprehensive appointment management










