refactor(apps): 主题系统迁移至 ColorScheme + 扩展架构并支持 Dark Mode

This commit is contained in:
qzl
2026-03-27 19:07:39 +08:00
parent ecc1ec6ce4
commit ae29a8209b
146 changed files with 4301 additions and 3200 deletions
@@ -4,18 +4,18 @@ import 'package:go_router/go_router.dart';
import 'package:lucide_icons/lucide_icons.dart';
import '../../../../app/di/injection.dart';
import '../../../../app/router/app_routes.dart';
import '../../../../app/router/home_return_policy.dart';
import '../../../../core/l10n/l10n.dart';
import '../../../../core/theme/design_tokens.dart';
import '../../../home/presentation/navigation/home_return_policy.dart';
import '../../../../shared/widgets/app_pull_refresh_feedback.dart';
import '../../../../shared/widgets/app_pressable.dart';
import '../../../../shared/widgets/back_title_page_header.dart';
import '../../../../shared/widgets/error_retry_surface.dart';
import '../../../../shared/widgets/full_screen_loading.dart';
import '../../../../shared/widgets/bottom_dock.dart';
import '../../../../shared/state/calendar_state_manager.dart';
import '../../../../shared/widgets/toast/toast.dart';
import '../../../../shared/widgets/toast/toast_type.dart';
import '../../../calendar/presentation/calendar_state_manager.dart';
import '../../../calendar/presentation/widgets/bottom_dock.dart';
import '../../data/todo_api.dart';
import '../../data/todo_repository.dart';
@@ -305,8 +305,9 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return Scaffold(
backgroundColor: AppColors.todoBg,
backgroundColor: colorScheme.surface,
body: PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) {
@@ -328,6 +329,7 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
}
Widget _buildHeader() {
final colorScheme = Theme.of(context).colorScheme;
return BackTitlePageHeader(
title: context.l10n.todoScreenTitle,
showBackButton: false,
@@ -342,20 +344,20 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
width: 36,
height: 36,
decoration: BoxDecoration(
color: AppColors.blue600,
color: colorScheme.primary,
borderRadius: BorderRadius.circular(AppRadius.full),
boxShadow: [
BoxShadow(
color: AppColors.blue300.withValues(alpha: 0.28),
color: colorScheme.primary.withValues(alpha: 0.28),
blurRadius: AppRadius.lg,
offset: const Offset(0, AppSpacing.xs),
),
],
),
child: const Icon(
child: Icon(
LucideIcons.plus,
size: 18,
color: AppColors.white,
color: colorScheme.onPrimary,
),
),
),
@@ -394,29 +396,31 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
}
Widget _buildDragBoard() {
final colorScheme = Theme.of(context).colorScheme;
final palette = Theme.of(context).extension<AppColorPalette>()!;
final quadrants = [
_QuadrantMeta(
value: 1,
title: context.l10n.todoQuadrantImportantUrgent,
textColor: AppColors.g1Text,
dividerColor: AppColors.g1Divider,
borderColor: AppColors.g1Border,
textColor: palette.g1Text,
dividerColor: palette.g1Divider,
borderColor: palette.g1Border,
items: _importantUrgent,
),
_QuadrantMeta(
value: 3,
title: context.l10n.todoQuadrantUrgentNotImportant,
textColor: AppColors.g2Text,
dividerColor: AppColors.g2Divider,
borderColor: AppColors.g2Border,
textColor: palette.g3Text,
dividerColor: palette.g3Divider,
borderColor: palette.g3Border,
items: _urgentNotImportant,
),
_QuadrantMeta(
value: 2,
title: context.l10n.todoQuadrantImportantNotUrgent,
textColor: AppColors.g3Text,
dividerColor: AppColors.g3Divider,
borderColor: AppColors.g3Border,
textColor: palette.g2Text,
dividerColor: palette.g2Divider,
borderColor: palette.g2Border,
items: _importantNotUrgent,
),
];
@@ -429,7 +433,7 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
contentsWhenEmpty: _buildEmptyQuadrant(),
lastTarget: const SizedBox(height: AppSpacing.lg),
decoration: BoxDecoration(
color: AppColors.todoCardBg,
color: colorScheme.surface,
borderRadius: BorderRadius.circular(14),
border: Border.all(color: meta.borderColor),
),
@@ -468,16 +472,16 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
listDivider: const SizedBox(height: AppSpacing.md),
itemDivider: Padding(
padding: const EdgeInsets.symmetric(horizontal: AppSpacing.md),
child: Container(height: 1, color: AppColors.slate100),
child: Container(height: 1, color: colorScheme.surfaceContainerHigh),
),
listPadding: EdgeInsets.zero,
itemDecorationWhileDragging: BoxDecoration(
color: AppColors.todoCardBg,
color: colorScheme.surface,
borderRadius: BorderRadius.circular(AppRadius.md),
border: Border.all(color: AppColors.borderSecondary),
border: Border.all(color: colorScheme.outlineVariant),
boxShadow: [
BoxShadow(
color: AppColors.slate200.withValues(alpha: 0.6),
color: colorScheme.shadow.withValues(alpha: 0.16),
blurRadius: AppRadius.md,
offset: const Offset(0, AppSpacing.xs),
),
@@ -530,6 +534,7 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
}
Widget _buildEmptyQuadrant() {
final colorScheme = Theme.of(context).colorScheme;
return SizedBox(
height: 60,
child: Center(
@@ -538,7 +543,7 @@ class _TodoQuadrantsScreenState extends State<TodoQuadrantsScreen> {
style: TextStyle(
fontFamily: 'Inter',
fontSize: 13,
color: AppColors.slate400,
color: colorScheme.outline,
),
),
),
@@ -645,6 +650,7 @@ class _TodoItemWidgetState extends State<_TodoItemWidget>
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return GestureDetector(
onTap: widget.onTap,
child: SizedBox(
@@ -656,11 +662,11 @@ class _TodoItemWidgetState extends State<_TodoItemWidget>
Expanded(
child: Text(
widget.item.title,
style: const TextStyle(
style: TextStyle(
fontFamily: 'Inter',
fontSize: 13,
fontWeight: FontWeight.w600,
color: AppColors.slate700,
color: colorScheme.onSurfaceVariant,
),
),
),
@@ -673,11 +679,13 @@ class _TodoItemWidgetState extends State<_TodoItemWidget>
width: 20,
height: 20,
decoration: BoxDecoration(
color: _isChecked ? AppColors.blue600 : Colors.white,
color: _isChecked
? colorScheme.primary
: colorScheme.surface,
border: Border.all(
color: _isChecked
? AppColors.blue600
: AppColors.slate300,
? colorScheme.primary
: colorScheme.outlineVariant,
width: 1.5,
),
borderRadius: BorderRadius.circular(4),
@@ -685,10 +693,10 @@ class _TodoItemWidgetState extends State<_TodoItemWidget>
child: _isChecked
? Transform.scale(
scale: _scaleAnimation.value,
child: const Icon(
child: Icon(
Icons.check,
size: 14,
color: Colors.white,
color: colorScheme.onPrimary,
),
)
: null,