2025-01-21 14:24:31 +03:00
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Тип функции для построения виджета с учетом темы
|
2025-01-21 14:24:31 +03:00
|
|
|
|
typedef ThemeBuilder = Widget Function();
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template theme_consumer}
|
|
|
|
|
|
/// Виджет для подписки на изменения темы приложения.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Автоматически перестраивает дочерние виджеты при изменении темы,
|
|
|
|
|
|
/// обеспечивая реактивность интерфейса к изменениям настроек темы.
|
|
|
|
|
|
/// {@endtemplate}
|
2025-01-21 14:24:31 +03:00
|
|
|
|
class ThemeConsumer extends StatelessWidget {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro theme_consumer}
|
2025-05-28 16:38:56 +03:00
|
|
|
|
const ThemeConsumer({required this.builder, super.key});
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Функция для построения виджета с учетом текущей темы
|
2025-01-21 14:24:31 +03:00
|
|
|
|
final ThemeBuilder builder;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
|
return Consumer<ThemeNotifier>(
|
2025-05-28 16:38:56 +03:00
|
|
|
|
builder: (_, _, _) {
|
2025-01-21 14:24:31 +03:00
|
|
|
|
return builder();
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template theme_notifier}
|
|
|
|
|
|
/// Класс для управления темой приложения.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Отвечает за:
|
|
|
|
|
|
/// - Хранение текущего режима темы (светлая/темная/системная)
|
|
|
|
|
|
/// - Уведомление подписчиков об изменениях темы
|
|
|
|
|
|
/// - Переключение между режимами темы
|
|
|
|
|
|
/// {@endtemplate}
|
2025-01-21 14:24:31 +03:00
|
|
|
|
final class ThemeNotifier extends ChangeNotifier {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro theme_notifier}
|
|
|
|
|
|
ThemeNotifier();
|
|
|
|
|
|
|
|
|
|
|
|
/// Текущий режим темы приложения
|
|
|
|
|
|
/// По умолчанию используется системная тема
|
2025-01-21 14:24:31 +03:00
|
|
|
|
ThemeMode _themeMode = ThemeMode.system;
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Получение текущего режима темы
|
2025-01-21 14:24:31 +03:00
|
|
|
|
ThemeMode get themeMode => _themeMode;
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Метод для переключения темы приложения.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Переключает между светлой и темной темой.
|
|
|
|
|
|
/// Если текущая тема светлая, переключает на темную и наоборот.
|
2025-01-21 14:24:31 +03:00
|
|
|
|
void changeTheme() {
|
2025-05-28 16:38:56 +03:00
|
|
|
|
_themeMode = _themeMode == ThemeMode.light
|
|
|
|
|
|
? ThemeMode.dark
|
|
|
|
|
|
: ThemeMode.light;
|
2025-01-21 14:24:31 +03:00
|
|
|
|
notifyListeners();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|