4.6 KiB
App Theme Dark Mode and Hardcoded Color Migration Implementation Plan
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Enable automatic light/dark mode following system settings and gradually migrate UI color usage from direct AppColors references to theme-driven semantic colors.
Architecture: Introduce a dual-theme foundation in AppTheme (light and dark) and route app root to ThemeMode.system. Then migrate color access in batches: first shared widgets, then high-traffic feature pages, then long-tail modules. Keep AppColors as design-token source only inside theme/token layers during migration.
Tech Stack: Flutter Material 3 (ThemeData, ColorScheme, ThemeMode), existing design tokens (AppColors, AppSpacing, AppRadius), flutter analyze/test verification.
Task 1: Theme Foundation and System Dark Mode Wiring
Files:
- Modify:
apps/lib/core/theme/app_theme.dart - Modify:
apps/lib/app/app.dart
Step 1: Build dual-theme entry points
- Add
AppTheme.darkand a shared private builderAppTheme._buildTheme(Brightness). - Ensure light and dark themes both use Material 3 and
ColorScheme.fromSeed.
Step 2: Remove theme-level hardcoded semantic colors
- Replace direct
AppColorsusage in app bar/button/input decoration theme with color-scheme-driven values. - Keep radii and spacing tokens unchanged.
Step 3: Wire root app to system mode
- In
MaterialApp.router, settheme,darkTheme, andthemeMode: ThemeMode.system.
Step 4: Verify
Run: cd apps && flutter analyze
Expected: no new analyzer errors.
Task 2: Shared Widget Batch (P0) - Replace Direct AppColors with Theme Semantics
Files:
- Modify:
apps/lib/shared/widgets/error_retry_surface.dart - Modify:
apps/lib/shared/widgets/confirm_sheet.dart - Modify:
apps/lib/shared/widgets/destructive_action_sheet.dart - Modify:
apps/lib/shared/widgets/toast/toast_type_config.dart
Step 1: Migrate simple error surface
- Use
Theme.of(context).colorScheme.errorfor retry message color.
Step 2: Migrate confirm/destructive sheets
- Replace sheet background/border/text/primary-action color bindings with
ColorSchemesemantic roles (surface,outlineVariant,onSurface,onSurfaceVariant,primary,onPrimary,error,onError).
Step 3: Migrate toast style mapping
- Replace static feedback colors with semantic color-scheme mappings per toast type.
- Preserve existing icon and l10n label behavior.
Step 4: Verify
Run: cd apps && flutter analyze
Expected: no new analyzer errors.
Task 3: Batch Migration Governance and Rollout Rules
Files:
- Modify:
docs/bugs/AppTheme硬编码颜色且缺失DarkMode.md
Step 1: Document batch strategy
- Add phased rollout strategy: Foundation -> Shared widgets (P0) -> Core pages (P1) -> Long tail (P2) -> guardrails.
Step 2: Define acceptance and rollback criteria
- Include per-batch verification (
flutter analyze, targeted widget tests/manual dark mode checks). - Require small-scope commits per batch for safe rollback.
Task 4: P1/P2 Execution Backlog (Follow-up)
Files:
- Modify:
apps/lib/features/home/** - Modify:
apps/lib/features/settings/** - Modify:
apps/lib/features/auth/** - Modify: remaining
apps/lib/features/**
Step 1: Prioritize by user path
- P1 order: home -> settings -> auth.
- P2: remaining feature pages and low-frequency screens.
Step 2: Migrate per file with semantic mapping
- Replace direct
AppColorsusage in widget code withTheme.of(context).colorSchemeor scoped theme helpers. - Keep visual behavior equivalent first; optimize polish after semantic migration is stable.
Step 3: Verify per batch
Run:
cd apps && flutter analyzecd apps && flutter test(targeted where tests exist)
Expected: no regressions in targeted flows and theme switching.
Risks and Mitigations
- Risk: dark mode contrast regression in legacy widgets.
- Mitigation: migrate shared widgets first, then high-traffic pages with screenshot/manual checks.
- Risk: mixed semantic + static colors during transition.
- Mitigation: enforce migration order and avoid adding new direct
AppColorsin UI layers.
- Mitigation: enforce migration order and avoid adding new direct
- Risk: broad-scope change fatigue.
- Mitigation: ship in small batches with isolated verification and rollback points.
Done Criteria
MaterialAppfollowsThemeMode.systemwiththemeanddarkThemeconfigured.- Theme layer no longer relies on static semantic colors for app-wide component themes.
- P0 shared widget batch migrated to theme semantics.
- Migration plan and execution progress documented in bug tracker doc.