Files
friflex_flutter_starter/lib/app/theme/theme_notifier.dart

60 lines
2.3 KiB
Dart
Raw Normal View History

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