theme_notifier.dart 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import 'package:flutter/material.dart';
  2. import 'theme_manager.dart';
  3. /// A notifier that updates when the theme changes
  4. class ThemeNotifier extends ChangeNotifier {
  5. static final ThemeNotifier _instance = ThemeNotifier._internal();
  6. factory ThemeNotifier() => _instance;
  7. ThemeNotifier._internal();
  8. SeasonalTheme _currentTheme = SeasonalTheme.default_;
  9. SeasonalTheme get currentTheme => _currentTheme;
  10. void setTheme(SeasonalTheme theme) {
  11. if (_currentTheme != theme) {
  12. _currentTheme = theme;
  13. notifyListeners();
  14. }
  15. }
  16. void initFromManager() {
  17. _currentTheme = ThemeManager.currentTheme;
  18. }
  19. }
  20. /// A widget that rebuilds when the theme changes
  21. class ThemeAwareBuilder extends StatelessWidget {
  22. final Widget Function(BuildContext context, SeasonalTheme theme) builder;
  23. const ThemeAwareBuilder({
  24. super.key,
  25. required this.builder,
  26. });
  27. @override
  28. Widget build(BuildContext context) {
  29. return ListenableBuilder(
  30. listenable: ThemeNotifier(),
  31. builder: (context, child) {
  32. return builder(context, ThemeNotifier().currentTheme);
  33. },
  34. );
  35. }
  36. }