Files
1356/flutter-project-structure.md
T
2026-01-03 18:35:35 +01:00

216 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LifeTimer — Flutter Project Structure
This document describes the recommended folder and file structure for the LifeTimer Flutter app, aligned with the architecture and flows.
Assumption: you will start from a standard `flutter create lifetimer` project, then adapt the `lib/` directory as follows.
---
## 1. High level layout
- `lib/`
- `main.dart` — app entrypoint, initializes Supabase and runs `LifeTimerApp`.
- `bootstrap/` — initialization helpers (Supabase client, dependency injection, env config).
- `core/` — cross cutting concerns (theme, routing, localization, widgets, utils, error handling).
- `data/` — shared data layer code (models, repositories, Supabase clients).
- `features/` — feature modules (auth, onboarding, goals, countdown, social, profile, settings, analytics).
---
## 2. lib/main.dart
Responsibilities:
- Ensure Flutter bindings are initialized.
- Initialize Supabase client (using config from `bootstrap/`).
- Run the `LifeTimerApp` widget.
File:
- `lib/main.dart`
---
## 3. Bootstrap and configuration
Folder:
- `lib/bootstrap/`
- `bootstrap.dart` — high level `bootstrap()` function called from `main.dart` (sets up Supabase, error handlers, env).
- `supabase_client.dart` — creates and exposes a configured Supabase client instance.
- `env.dart` — holds environment configuration (Supabase URL, anon key, build flavor hooks).
---
## 4. Core module
Folder:
- `lib/core/`
- `theme/`
- `app_theme.dart` — light/dark theme definitions, colors, typography.
- `routing/`
- `app_router.dart` — central route definitions and navigation helpers.
- `localization/`
- `l10n.dart` — localization setup (generated or custom wrapper).
- `widgets/`
- `primary_button.dart` — reusable CTA button.
- `app_scaffold.dart` — base scaffold with consistent background and app bar style.
- `bottom_nav_scaffold.dart` — scaffold wiring bottom navigation.
- `loading_indicator.dart` — standard loading widget.
- `empty_state.dart` — reusable empty state widget.
- `errors/`
- `failure.dart` — domain error types.
- `error_mapper.dart` — maps Supabase / network errors to user friendly messages.
- `utils/`
- `date_time_utils.dart` — countdown calculations, formatting.
- `validators.dart` — input validation helpers.
- `state/` (if using Riverpod/Provider wrappers)
- `providers.dart` — top level providers (Supabase client, theme mode, auth state).
---
## 5. Data layer
Folder:
- `lib/data/`
- `supabase/`
- `supabase_client_provider.dart` — exposes Supabase client to the app (e.g., via Riverpod/Provider).
- `models/`
- `user_model.dart` — app level User model.
- `goal_model.dart` — Goal model.
- `goal_step_model.dart` — GoalStep model.
- `activity_model.dart` — Activity model.
- `repositories/`
- `auth_repository.dart` — login, logout, token refresh.
- `user_repository.dart` — profile read/update, visibility toggle.
- `goals_repository.dart` — CRUD for goals and steps, enforce 120 limit.
- `countdown_repository.dart` — start countdown, compute remaining time.
- `social_repository.dart` — followers, feeds, leaderboards (Phase 2+).
- `notifications_repository.dart` — notification preferences and tokens.
Repositories hide Supabase queries behind a clean API, so features do not talk to Supabase directly.
---
## 6. Feature modules
Each feature lives under `lib/features/<feature_name>/` with a simple structure:
- `presentation/` — screens and widgets.
- `application/` — state management (view models, controllers, providers).
- `domain/` (optional) — feature specific entities and logic.
### 6.1 Auth feature
- `lib/features/auth/presentation/`
- `auth_gate.dart` — decides whether to show auth screens or main app based on session.
- `sign_in_screen.dart`
- `sign_up_screen.dart`
- `auth_loading_screen.dart` — transient during OAuth redirects.
- `lib/features/auth/application/`
- `auth_controller.dart` — wraps `auth_repository`, exposes current user/session state.
### 6.2 Onboarding feature
- `lib/features/onboarding/presentation/`
- `onboarding_intro_screen.dart`
- `onboarding_how_it_works_screen.dart`
- `onboarding_motivation_screen.dart`
- `lib/features/onboarding/application/`
- `onboarding_controller.dart` — tracks whether onboarding is completed.
### 6.3 Goals feature
- `lib/features/goals/presentation/`
- `goals_list_screen.dart` — list of goals, empty state, add/edit buttons.
- `goal_edit_screen.dart` — create/edit goal (title, description, location, image, milestones).
- `goal_detail_screen.dart` — view and update progress, mark as completed.
- `lib/features/goals/application/`
- `goals_controller.dart` — loads goals, enforces max 20, exposes list/state.
- `goal_detail_controller.dart` — state for a single goal.
### 6.4 Countdown feature
- `lib/features/countdown/presentation/`
- `home_countdown_screen.dart` — main world-time inspired countdown UI.
- `countdown_summary_screen.dart` — shown after countdown ends, summary stats.
- `lib/features/countdown/application/`
- `countdown_controller.dart` — calculates remaining time, exposes streams/timers.
### 6.5 Social feature (Phase 2+)
- `lib/features/social/presentation/`
- `social_feed_screen.dart`
- `leaderboards_screen.dart`
- `public_profile_screen.dart`
- `lib/features/social/application/`
- `social_feed_controller.dart`
- `leaderboards_controller.dart`
### 6.6 Profile feature
- `lib/features/profile/presentation/`
- `profile_screen.dart` — shows own profile, countdown info, stats.
- `lib/features/profile/application/`
- `profile_controller.dart` — loads and updates profile, visibility, avatar.
### 6.7 Settings feature
- `lib/features/settings/presentation/`
- `settings_home_screen.dart`
- `account_settings_screen.dart`
- `appearance_settings_screen.dart`
- `notification_settings_screen.dart`
- `privacy_settings_screen.dart` — global Public/Private toggle, blocking.
- `about_challenge_screen.dart`
- `lib/features/settings/application/`
- `settings_controller.dart` — wraps repositories for user preferences.
### 6.8 Analytics / insights (Phase 3)
- `lib/features/analytics/presentation/`
- `insights_screen.dart` — charts and stats.
- `lib/features/analytics/application/`
- `insights_controller.dart`
---
## 7. Navigation and route names
- Central router file: `lib/core/routing/app_router.dart`.
- Define named routes for key screens, grouped by feature, e.g.:
- `/``AuthGate` (decides between auth vs main app).
- `/onboarding/*` for onboarding screens.
- `/home``HomeCountdownScreen`.
- `/goals`, `/goals/:id`, `/goals/:id/edit`.
- `/social`, `/social/leaderboards`, `/u/:username`.
- `/settings/*` for settings sections.
The router uses the navigation library you choose (Navigator 2.0, go_router, etc.); this file is the single source of truth for destinations.
---
## 8. State management
If you use Riverpod or Provider:
- Global providers in `lib/core/state/providers.dart`:
- `supabaseClientProvider`
- `authControllerProvider`
- `themeModeProvider`
- Feature specific providers next to controllers in their `application/` folders.
---
## 9. Testing structure
Mirror the feature structure under `test/`:
- `test/core/` — utilities, date/time tests, error mapping tests.
- `test/data/` — repository tests with mocked Supabase client.
- `test/features/<feature_name>/` — unit and widget tests for each feature.
This structure keeps the app modular and makes it easy to grow features (e.g., adding more social or analytics functionality) without losing clarity.