Overview
Wonderous separates business logic from UI code using dedicated “logic” classes. These classes are registered with GetIt for dependency injection and accessed throughout the app via global variables and mixins.Architecture Principles
Separation of Concerns
The logic layer is completely separate from the UI layer:- Logic classes: Handle state management, data access, and business rules
- UI widgets: Handle presentation and user interaction only
- No business logic in widgets: Widgets delegate all decisions to logic classes
Dependency Injection
All logic classes are registered with GetIt at app startup:- Global variables:
appLogic,wondersLogic,settingsLogic - GetIt mixin:
GetItStatefulWidgetMixin
Global Access
Logic instances are exposed as global variables inlib/main.dart:
Core Logic Classes
AppLogic
AppLogic handles app-level concerns like initialization, orientation, and navigation.
Location: lib/logic/app_logic.dart
Responsibilities
- Bootstrap: Initialize services and load data
- Orientation: Manage device orientation settings
- App Size: Track and respond to screen size changes
- Image Precaching: Preload critical images
- Dialog Navigation: Show full-screen dialogs
Key Properties
Bootstrap Sequence
Orientation Management
WondersLogic
WondersLogic manages wonder data access.
Location: lib/logic/wonders_logic.dart
Usage
SettingsLogic
SettingsLogic manages app settings with automatic persistence.
Location: lib/logic/settings_logic.dart
Persistence Pattern
Settings useThrottledSaveLoadMixin for automatic save/load:
ValueNotifier triggers scheduleSave(), which debounces and persists to disk.
CollectiblesLogic
CollectiblesLogic manages collectible discovery state.
Location: lib/logic/collectibles_logic.dart
TimelineLogic
TimelineLogic manages timeline event data.
Location: lib/logic/timeline_logic.dart
Provides:
- Global historical events
- Wonder-specific events
- Combined timeline data for display
ArtifactApiLogic
ArtifactApiLogic handles Metropolitan Museum API integration.
Location: lib/logic/artifact_api_logic.dart
Provides:
- Artifact search by wonder and date range
- Individual artifact data fetching
- API response caching
UnsplashLogic
UnsplashLogic manages Unsplash photo integration.
Location: lib/logic/unsplash_logic.dart
Provides:
- Photo fetching by collection
- Photo search
- Attribution data
LocaleLogic
LocaleLogic handles internationalization.
Location: lib/logic/locale_logic.dart
Provides:
- Locale loading
- Language switching
- Localized string access
State Management Pattern
ValueNotifier
Logic classes useValueNotifier for reactive state:
GetIt Mixin
Widgets useGetItStatefulWidgetMixin for reactive dependencies:
Service Classes
Some logic classes wrap external services:ArtifactApiService
Location:lib/logic/artifact_api_service.dart
HTTP client for MET Museum API
UnsplashService
Location:lib/logic/unsplash_service.dart
HTTP client for Unsplash API
NativeWidgetService
Location:lib/logic/native_widget_service.dart
Platform channel for home screen widgets
Best Practices
- Single Responsibility: Each logic class handles one domain area
- No UI Code: Logic classes never import Flutter widgets (except foundation)
- Global Access: Expose logic instances as global getters for convenience
- Lifecycle: Initialize in
AppLogic.bootstrap()in dependency order - State: Use
ValueNotifierfor reactive state that UI needs to observe - Persistence: Use
ThrottledSaveLoadMixinfor data that needs to persist - Immutability: Keep data models immutable; only logic classes mutate state
- Testing: Logic classes are easy to test in isolation
Initialization Order
The bootstrap sequence is carefully ordered:- Platform setup (window size, refresh rate)
- Asset loading (bitmaps)
- Settings loading (persistent data)
- Localization loading
- Wonder data initialization
- Timeline data initialization
- Collectibles initialization and loading
- Navigation to initial screen
Related Files
lib/logic/app_logic.dart- App lifecycle and global utilitieslib/logic/wonders_logic.dart- Wonder data accesslib/logic/settings_logic.dart- App settings managementlib/logic/collectibles_logic.dart- Collectible discovery statelib/logic/timeline_logic.dart- Timeline event datalib/logic/artifact_api_logic.dart- MET Museum API integrationlib/logic/unsplash_logic.dart- Unsplash API integrationlib/logic/locale_logic.dart- Internationalizationlib/logic/common/save_load_mixin.dart- Persistence utilities