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
@@ -72,7 +72,7 @@ class _DetailHeaderActionMenuState<T> extends State<DetailHeaderActionMenu<T>> {
CompositedTransformFollower(
link: _layerLink,
showWhenUnlinked: false,
offset: const Offset(
offset: Offset(
_buttonSize - _menuWidth,
_buttonSize + AppSpacing.sm,
),
@@ -101,18 +101,19 @@ class _DetailHeaderActionMenuState<T> extends State<DetailHeaderActionMenu<T>> {
}
Widget _buildMenuCard() {
final colorScheme = Theme.of(context).colorScheme;
return Material(
color: Colors.transparent,
color: colorScheme.surface.withValues(alpha: 0),
child: Container(
width: _menuWidth,
padding: const EdgeInsets.symmetric(vertical: AppSpacing.sm),
decoration: BoxDecoration(
color: AppColors.white,
color: colorScheme.surface,
borderRadius: BorderRadius.circular(AppRadius.lg),
border: Border.all(color: AppColors.borderSecondary),
border: Border.all(color: colorScheme.outlineVariant),
boxShadow: [
BoxShadow(
color: AppColors.slate300.withValues(alpha: 0.42),
color: colorScheme.shadow.withValues(alpha: 0.42),
blurRadius: AppSpacing.xl,
offset: const Offset(0, AppSpacing.sm),
),
@@ -125,12 +126,14 @@ class _DetailHeaderActionMenuState<T> extends State<DetailHeaderActionMenu<T>> {
for (int i = 0; i < widget.items.length; i++) ...[
_buildMenuItem(widget.items[i]),
if (i < widget.items.length - 1)
const Padding(
padding: EdgeInsets.symmetric(horizontal: AppSpacing.md),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: AppSpacing.md,
),
child: Divider(
height: 1,
thickness: 1,
color: AppColors.slate100,
color: colorScheme.outlineVariant,
),
),
],
@@ -141,21 +144,26 @@ class _DetailHeaderActionMenuState<T> extends State<DetailHeaderActionMenu<T>> {
}
Widget _buildMenuItem(DetailHeaderActionItem<T> item) {
final colorScheme = Theme.of(context).colorScheme;
final textColor = item.isDestructive
? AppColors.red500
: (item.enabled ? AppColors.slate700 : AppColors.slate400);
? colorScheme.error
: (item.enabled ? colorScheme.onSurface : colorScheme.onSurfaceVariant);
final pressedColor = item.isDestructive
? AppColors.feedbackErrorSurface
: AppColors.surfaceInfoLight;
? colorScheme.errorContainer
: colorScheme.primaryContainer;
return SizedBox(
height: AppSpacing.xxl * 2,
child: Material(
color: Colors.transparent,
color: colorScheme.surface.withValues(alpha: 0),
child: InkWell(
borderRadius: BorderRadius.circular(AppRadius.md),
splashColor: item.enabled ? pressedColor : Colors.transparent,
highlightColor: item.enabled ? pressedColor : Colors.transparent,
splashColor: item.enabled
? pressedColor
: colorScheme.surface.withValues(alpha: 0),
highlightColor: item.enabled
? pressedColor
: colorScheme.surface.withValues(alpha: 0),
onTap: item.enabled ? () => _handleSelect(item.value) : null,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: AppSpacing.md),
@@ -190,6 +198,7 @@ class _DetailHeaderActionMenuState<T> extends State<DetailHeaderActionMenu<T>> {
return const SizedBox.shrink();
}
final colorScheme = Theme.of(context).colorScheme;
return CompositedTransformTarget(
link: _layerLink,
child: GestureDetector(
@@ -200,19 +209,19 @@ class _DetailHeaderActionMenuState<T> extends State<DetailHeaderActionMenu<T>> {
height: _buttonSize,
decoration: BoxDecoration(
color: _isMenuOpen
? AppColors.surfaceInfo
: AppColors.surfaceTertiary,
? colorScheme.secondaryContainer
: colorScheme.tertiaryContainer,
borderRadius: BorderRadius.circular(AppRadius.md),
border: Border.all(
color: _isMenuOpen
? AppColors.borderQuaternary
: AppColors.borderTertiary,
? colorScheme.outlineVariant
: colorScheme.outline,
),
),
child: const Icon(
child: Icon(
Icons.more_horiz,
size: AppSpacing.lg + AppSpacing.xs,
color: AppColors.slate600,
color: colorScheme.onSurfaceVariant,
),
),
),