This commit is contained in:
Artem Luzin m
2025-06-17 20:05:59 +07:00
parent e12fc35917
commit f7d4c02623
6 changed files with 89 additions and 31 deletions

View File

@@ -1,18 +1,83 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
/// {@template app_colors}
/// Класс, реализующий расширение для добавления токенов в цветовую схему
extension AppColorsScheme on ColorScheme {
bool get _isDark => brightness == Brightness.dark;
/// {@endtemplate}
class AppColors extends ThemeExtension<AppColors> with DiagnosticableTreeMixin {
/// {@macro app_colors}
///
/// Принимает:
///
/// * [testColor] - цвет тестового текста
/// * [errorSnackbarBackground] - цвет фона снекбара ошибки
/// * [successSnackbarBackground] - цвет фона снекбара успеха
/// * [infoSnackbarBackground] - цвет фона снекбара информации
const AppColors({
required this.testColor,
required this.errorSnackbarBackground,
required this.successSnackbarBackground,
required this.infoSnackbarBackground,
});
// Тестовый цвет
Color get testColor => _isDark ? Colors.green : Colors.red;
/// Цвет тестового текста
final Color testColor;
/// Цвет заднего фона снекбара с ошибкой
Color get errorSnackbarBackground => const Color(0xFFD24720);
/// Цвет фона снекбара ошибки
final Color errorSnackbarBackground;
/// Цвет заднего фона снекбара с успехом
Color get successSnackbarBackground => const Color(0xFF6FB62C);
/// Цвет фона снекбара успеха
final Color successSnackbarBackground;
/// Цвет заднего фона снекбара с информацией
Color get infoSnackbarBackground => const Color.fromARGB(255, 220, 108, 77);
/// Цвет фона снекбара информации
final Color infoSnackbarBackground;
/// Цвета светлой темы
static final AppColors light = AppColors(
testColor: Colors.red,
errorSnackbarBackground: const Color(0xFFD24720),
successSnackbarBackground: const Color(0xFF6FB62C),
infoSnackbarBackground: const Color.fromARGB(255, 220, 108, 77),
);
/// Цвета тёмной темы
static final AppColors dark = AppColors(
testColor: Colors.red,
errorSnackbarBackground: const Color(0xFFD24720),
successSnackbarBackground: const Color(0xFF6FB62C),
infoSnackbarBackground: const Color.fromARGB(255, 220, 108, 77),
);
@override
ThemeExtension<AppColors> copyWith({
Color? testColor,
Color? errorSnackbarBackground,
Color? successSnackbarBackground,
Color? infoSnackbarBackground,
}) => AppColors(
testColor: testColor ?? this.testColor,
errorSnackbarBackground: errorSnackbarBackground ?? this.errorSnackbarBackground,
successSnackbarBackground: successSnackbarBackground ?? this.successSnackbarBackground,
infoSnackbarBackground: infoSnackbarBackground ?? this.infoSnackbarBackground,
);
@override
ThemeExtension<AppColors> lerp(covariant ThemeExtension<AppColors>? other, double t) {
if (other is! AppColors) return this;
return AppColors(
testColor: Color.lerp(testColor, other.testColor, t)!,
errorSnackbarBackground: Color.lerp(
errorSnackbarBackground,
other.errorSnackbarBackground,
t,
)!,
successSnackbarBackground: Color.lerp(
successSnackbarBackground,
other.successSnackbarBackground,
t,
)!,
infoSnackbarBackground: Color.lerp(infoSnackbarBackground, other.infoSnackbarBackground, t)!,
);
}
}

View File

@@ -1,10 +1,13 @@
import 'package:flutter/material.dart';
import 'package:friflex_starter/app/theme/app_colors_scheme.dart';
/// Класс для конфигурации светлой/темной темы приложения
abstract class AppTheme {
/// Геттер для получения светлой темы
static ThemeData get light => ThemeData.light();
static ThemeData get light =>
ThemeData.light().copyWith(extensions: <ThemeExtension<Object?>>[AppColors.light]);
/// Геттер для получения темной темы
static ThemeData get dark => ThemeData.dark();
static ThemeData get dark =>
ThemeData.dark().copyWith(extensions: <ThemeExtension<Object?>>[AppColors.dark]);
}