theme static method
Implementation
static String theme({required bool useGradient}) {
final gradientImport =
useGradient ? "import '../tokens/app_gradients.dart';\n" : '';
final gradientField = useGradient
? '\n static const Gradient primaryGradient = AppGradients.primary;\n'
: '';
final gradientNote = useGradient
? '\n /// Gradients available via AppGradients (see app_gradients.dart).'
: '';
return '''
import 'package:flutter/material.dart';
import '../tokens/app_colors.dart';
import '../tokens/app_radius.dart';
import '../tokens/app_spacing.dart';
import '../tokens/app_typography.dart';
$gradientImport
import 'app_theme_extensions.dart';
/// App-wide ThemeData (light + dark).$gradientNote
class AppTheme {
AppTheme._();
$gradientField
static List<ThemeExtension<dynamic>> get _lightExtensions => <ThemeExtension<dynamic>>[
AppSurfaceTheme.light,
AppShadowTheme.light,
AppBlurTheme.tokens,
AppBorderTheme.light,
AppMotionTheme.tokens,
AppComponentTheme.tokens,
];
static List<ThemeExtension<dynamic>> get _darkExtensions => <ThemeExtension<dynamic>>[
AppSurfaceTheme.dark,
AppShadowTheme.dark,
AppBlurTheme.tokens,
AppBorderTheme.dark,
AppMotionTheme.tokens,
AppComponentTheme.tokens,
];
static ThemeData get light => ThemeData(
useMaterial3: true,
brightness: Brightness.light,
colorScheme: const ColorScheme.light(
primary: AppColors.primary,
onPrimary: AppColors.onPrimary,
secondary: AppColors.secondary,
onSecondary: AppColors.onSecondary,
surface: AppColors.surface,
onSurface: AppColors.textPrimary,
error: AppColors.error,
onError: AppColors.onPrimary,
outline: AppColors.outline,
),
scaffoldBackgroundColor: AppColors.background,
appBarTheme: const AppBarTheme(
backgroundColor: AppColors.surface,
foregroundColor: AppColors.textPrimary,
elevation: 0,
centerTitle: false,
),
textTheme: const TextTheme(
headlineLarge: AppTypography.display,
headlineMedium: AppTypography.headline,
headlineSmall: AppTypography.title,
bodyMedium: AppTypography.body,
bodySmall: AppTypography.caption,
labelLarge: AppTypography.button,
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.primary,
foregroundColor: AppColors.onPrimary,
minimumSize: const Size(48, 48),
padding: const EdgeInsets.symmetric(
horizontal: AppSpacing.lg,
vertical: AppSpacing.sm,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.md),
),
textStyle: AppTypography.button,
),
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: AppColors.surfaceVariant,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(AppRadius.md),
borderSide: const BorderSide(color: AppColors.outlineVariant),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(AppRadius.md),
borderSide: const BorderSide(color: AppColors.primary, width: 2),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(AppRadius.md),
borderSide: const BorderSide(color: AppColors.error),
),
contentPadding: const EdgeInsets.symmetric(
horizontal: AppSpacing.md,
vertical: AppSpacing.sm,
),
),
extensions: _lightExtensions,
);
static ThemeData get dark => ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorScheme: const ColorScheme.dark(
primary: AppColorsDark.primary,
onPrimary: AppColorsDark.onPrimary,
secondary: AppColorsDark.secondary,
onSecondary: AppColorsDark.onSecondary,
surface: AppColorsDark.surface,
onSurface: AppColorsDark.textPrimary,
error: AppColorsDark.error,
onError: AppColorsDark.onPrimary,
outline: AppColorsDark.outline,
),
scaffoldBackgroundColor: AppColorsDark.background,
appBarTheme: const AppBarTheme(
backgroundColor: AppColorsDark.surface,
foregroundColor: AppColorsDark.textPrimary,
elevation: 0,
centerTitle: false,
),
extensions: _darkExtensions,
);
}
''';
}