49 lines
1.5 KiB
Markdown
49 lines
1.5 KiB
Markdown
|
|
# Flutter App Structure
|
||
|
|
|
||
|
|
## Entry Flow
|
||
|
|
|
||
|
|
```
|
||
|
|
main.dart → AppThemeProvider → MaterialApp → AppRoot → Screen
|
||
|
|
```
|
||
|
|
|
||
|
|
## Folders
|
||
|
|
|
||
|
|
| Folder | Purpose |
|
||
|
|
|--------|---------|
|
||
|
|
| `screens/` | Full-screen views (splash, dashboard, overheat) |
|
||
|
|
| `widgets/` | Reusable components (stat_box, navigator) |
|
||
|
|
| `services/` | Singletons with business logic |
|
||
|
|
| `theme/` | Color definitions and runtime theme switching |
|
||
|
|
|
||
|
|
## Services
|
||
|
|
|
||
|
|
All services use singleton pattern with `ServiceName.instance`.
|
||
|
|
|
||
|
|
| Service | Role |
|
||
|
|
|---------|------|
|
||
|
|
| `ConfigService` | Loads `config.json`, exposes settings |
|
||
|
|
| `PiIO` | Pi hardware interface (CPU temp, future GPIO) |
|
||
|
|
| `OverheatMonitor` | Polls temp, fires callback when threshold exceeded |
|
||
|
|
| `ThemeService` | Dark/bright mode state, notifies listeners |
|
||
|
|
| `TestFlipFlopService` | Debug: toggles theme + navigator emotion every 2s |
|
||
|
|
|
||
|
|
## Theme System
|
||
|
|
|
||
|
|
- `AppColors` — static color constants (dark/bright variants), auto-generated from JSON
|
||
|
|
- `AppTheme` — InheritedWidget providing runtime colors via `AppTheme.of(context)`
|
||
|
|
- `ThemeService` — singleton holding current mode, call `setDarkMode(bool)` or `toggle()`
|
||
|
|
|
||
|
|
Usage in widgets:
|
||
|
|
```dart
|
||
|
|
final theme = AppTheme.of(context);
|
||
|
|
backgroundColor: theme.background,
|
||
|
|
color: theme.foreground,
|
||
|
|
```
|
||
|
|
|
||
|
|
## Screen Lifecycle
|
||
|
|
|
||
|
|
`AppRoot` manages which screen is visible:
|
||
|
|
1. **SplashScreen** — during init sequence
|
||
|
|
2. **DashboardScreen** — normal operation
|
||
|
|
3. **OverheatScreen** — when `OverheatMonitor` triggers (leads to shutdown)
|