TaskDeck is a mobile task management engine built using Flutter and Dart. This application is engineered to move away from flat checklists, employing a normalized relational hierarchy (Users -> Subjects -> Assignments -> Subtasks) powered locally by SQLite.
TaskDeck helps students organize their academic workload by grouping assignments under subjects, breaking each assignment down into subtasks, and surfacing progress through a dashboard view. All data is persisted locally on-device via SQLite, with user accounts, subjects, assignments, and subtasks stored in a fully relational schema with cascading deletes and enforced data-integrity constraints.
- Install prerequisites
- Flutter SDK 3.x (includes Dart 3.x)
- A configured emulator/simulator, or a physical device with USB debugging enabled, or a desktop/web target
- Clone the repository
git clone https://github.com/rhianne-st/taskdeck-assignment-tracker-app.git cd taskdeck-assignment-tracker-app - Install dependencies
flutter pub get
- Generate Riverpod/database code (required, since providers and repositories rely on generated
.g.dartfiles)dart run build_runner build --delete-conflicting-outputs
- Verify your setup
flutter doctor
- Run the app
Select your target device when prompted, or pass a platform flag directly, e.g.
flutter run
flutter run -d windows.
- Register a new account or log in with existing (demo) credentials from the login screen.
- From the Home Dashboard, review your assignments at a glance, filtered by status (Not started, Ongoing, On hold, Completed) and by subject.
- The Assignments tab shows you the complete list of assignments, allowing filtering and sorting.
- Use the Subjects tab to view, edit, or archive subjects, and expand a subject card to see its related assignments.
- Open an assignment to view or edit its details, due date, type, notes, and manage its subtasks checklist.
- Mark assignments or subjects as archived to move them into the Archived tab, which keeps a separate history of completed work without cluttering the active dashboard.
- Log out at any time from the dashboard's app bar action.
Use these demo accounts to explore the app without creating new data:
- Account 1
- Email: lydia@mail.com
- Password: mockpass_1
- Account 2
- Email: marcus@mail.com
- Password: mockpass_2
Note: On first launch, the database seeds mock multi-user demo data via
seedMockData(db)so the app is immediately explorable.
- User Authentication — Local email/password registration and login, with validation (name, email format, minimum password length, duplicate-email checks) handled in
AuthService. - Subject Management — Create, edit, archive, and delete subjects; each subject displays a live count of its active assignments.
- Assignment Tracking — Create and edit assignments with a name, due date, type (
Assignment,Presentation,Test,Homework,Other), status (Not started,Ongoing,On hold,Completed), and optional notes. - Subtask Checklists — Break assignments into individually completable subtasks with inline edit/delete support.
- Dashboard Filtering & Search — Filter assignments by status or subject, and search across assignments from the dashboard search bar.
- Progress Indicators — Visual progress bars and status-colour coding reflect completion state at a glance.
- Archived History — Separately browse archived assignments and archived subjects in a dedicated tabbed view.
- Cross-Platform Persistence — Local SQLite storage on mobile/desktop via
sqflite/sqflite_common_ffi, with a web-compatible mock data layer for browser targets. - Data Integrity — Foreign keys,
ON DELETE CASCADErelationships, boolean and enumCHECKconstraints, and indexed lookups enforced at the database layer.
- Framework: Flutter 3.x / Dart 3.x
- Local Database: SQLite (
sqflite,sqflite_common_ffi,sqflite_common_ffi_webfor web) - Data Access: Repository pattern on top of a singleton DB connector (
AppDatabase) - State Management:
flutter_riverpodwith code-generated providers (riverpod_annotation/build_runner) inlib/states/ - Architecture: Layer-first with feature subfolders (data/models/screens/widgets)
taskdeck_assignment_tracker_app/
├── assets/ # Static media assets & UI configuration files
└── lib/ # Application root source directory
├── core/ # Global system resources & utilities
│ ├── themes/
│ └── utils/ # Shared utility helpers
├── data/ # --- DATA STORAGE MANAGEMENT LAYER ---
│ ├── database/ # SQLite engine init + mock seeding
│ ├── repositories/ # CRUD repositories per entity
├── models/ # --- DATA MODEL CONFIGURATION LAYER ---
│ ├── assignments/ # Task structural objects (assignment_model, subtask_model)
│ ├── subjects/ # Module structural objects (subject_model)
│ └── users/ # User structural object (user_model)
├── screens/ # --- ENTRY POINT VIEW LAYERS (PAGES) ---
│ ├── auth/ # Application gateway views (login_screen, register_screen)
│ ├── dashboard/ # Main analytical landing layout (home_screen)
│ ├── assignments/ # Detail logs and dynamic submission interfaces
│ ├── subjects/
│ └── archived/ # Historical completed record interfaces
├── services/ # --- DATA SERVICES ---
│ └── auth_service.dart
├── states/ # --- CENTRAL LOGIC & STATE LIFECYCLE LAYER ---
│ ├── auth/ # Auth session state
│ ├── layout/ # Shell/navigation state
│ ├── assignments/ # Sorting, filtering, and CRUD state streams
│ └── subjects/ # Dropdown lifecycle and selection managers
├── utils/ # Shared helpers (colour conversion, status colours)
├── widgets/ # --- REUSABLE MICRO-INTERFACE OBJECTS ---
│ ├── assignments/ # Cards, indicators, and checklist tiles
│ ├── auth/ # Auth screen widgets
│ ├── layout/ # App shell, search, filter bar
│ └── subjects/ # Grid circles and layout sheet overlays
└── main.dart # Application bootstrap initialization root
+-----------------------+
| USERS |
+-----------------------+
| PK | id (TEXT) |
| | name (TEXT) |
| | email (TEXT UQ)|
| | pass (TEXT) |
+-----------------------+
|
1:N (ON DELETE CASCADE)
|
v
+--------------------------------------------+
| SUBJECTS |
+--------------------------------------------+
| PK | subject_id (TEXT) |
| FK | user_id (TEXT) -> users.id |
| | name (TEXT) |
| | color_hex (TEXT, DEFAULT '#A3A29C')|
| | is_archived (0/1 CHECK) |
+--------------------------------------------+
| INDEX: idx_subjects_user (user_id) |
+--------------------------------------------+
|
1:N (ON DELETE CASCADE)
|
v
+-------------------------------------------------------------+
| ASSIGNMENTS |
+-------------------------------------------------------------+
| PK | assignment_id (TEXT) |
| FK | subject_id (TEXT) -> subjects.subject_id |
| | name (TEXT) |
| | due_date (TEXT) |
| | assignment_type (ENUM CHECK) |
| | status (ENUM CHECK) |
| | status_before_completion(TEXT, nullable) |
| | notes (TEXT, nullable) |
| | is_archived (0/1 CHECK) |
+-------------------------------------------------------------+
| INDEXES: idx_assignments_subject (subject_id) |
| idx_assignments_status (status) |
+-------------------------------------------------------------+
|
1:N (ON DELETE CASCADE)
|
v
+-------------------------------------------------------------+
| SUBTASKS |
+-------------------------------------------------------------+
| PK | subtask_id (TEXT) |
| FK | assignment_id (TEXT) -> assignments.assignment_id |
| | title (TEXT) |
| | is_completed (0/1 CHECK) |
+-------------------------------------------------------------+
| INDEX: idx_subtasks_assignment (assignment_id) |
+-------------------------------------------------------------+