From 1032b091141178b5e65abca85add3e2b63ae7d5a Mon Sep 17 00:00:00 2001 From: "Sanders (aider)" Date: Mon, 9 Jun 2025 18:42:58 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D1=81=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20Hive=20CE=20=D0=B8=20dependency=20injectio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 30 ++++++++++--------- lib/pages/home_page.dart | 23 +++------------ lib/pages/settings_page.dart | 47 ++++++++++++++++++++++-------- lib/services/settings_service.dart | 22 ++++++++++++++ 4 files changed, 77 insertions(+), 45 deletions(-) create mode 100644 lib/services/settings_service.dart diff --git a/lib/main.dart b/lib/main.dart index dccc260..4e0ab91 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:budget_app/pages/home_page.dart'; // Импорт нашей новой страницы -import 'theme/app_theme.dart'; // Импорт тем приложения +import 'package:budget_app/pages/home_page.dart'; +import 'theme/app_theme.dart'; import 'package:hive_ce_flutter/hive_flutter.dart'; - -/// Точка входа в приложение import 'injection_container.dart' as di; +import 'services/settings_service.dart'; +import 'package:get_it/get_it.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -25,18 +25,23 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - late final Box _settingsBox; + late final SettingsService _settingsService; @override void initState() { super.initState(); - _settingsBox = Hive.box('settings'); + _settingsService = GetIt.instance(); + _settingsService.addListener(_onThemeChanged); } - bool get _isDarkMode => _settingsBox.get('darkMode', defaultValue: false); + @override + void dispose() { + _settingsService.removeListener(_onThemeChanged); + super.dispose(); + } - void toggleTheme() { - _settingsBox.put('darkMode', !_isDarkMode); + void _onThemeChanged() { + setState(() {}); } @override @@ -45,11 +50,8 @@ class _MyAppState extends State { title: 'Budget App', theme: AppTheme.lightTheme(), darkTheme: AppTheme.darkTheme(), - themeMode: _isDarkMode ? ThemeMode.dark : ThemeMode.light, - home: HomePage( - onThemeToggle: toggleTheme, - isDarkMode: _isDarkMode, - ), + themeMode: _settingsService.isDarkMode ? ThemeMode.dark : ThemeMode.light, + home: const HomePage(), ); } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index d0a643e..151a0af 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -5,34 +5,19 @@ import 'settings_page.dart'; * Главная страница приложения для управления бюджетом. * * Этот виджет является основным экраном приложения и содержит: - * - AppBar с заголовком и кнопкой переключения темы + * - AppBar с заголовком и кнопкой настроек * - Основной контент с приветственным сообщением * * Особенности реализации: * 1. Наследуется от StatelessWidget, так как не содержит собственного состояния - * 2. Принимает параметры извне (колбек и флаг темы) - * 3. Использует Material Design через Scaffold + * 2. Использует Material Design через Scaffold + * 3. Управление темой вынесено в SettingsService */ class HomePage extends StatelessWidget { - /// Колбек для переключения между светлой и темной темой - /// Вызывается при нажатии на кнопку в AppBar - final VoidCallback onThemeToggle; - - /// Флаг текущей темы приложения: - /// - true: темная тема активна - /// - false: светлая тема активна - final bool isDarkMode; - /// Конструктор виджета /// /// @param key - опциональный ключ для идентификации виджета - /// @param onThemeToggle - обязательный колбек для переключения темы - /// @param isDarkMode - обязательный флаг текущей темы - const HomePage({ - super.key, - required this.onThemeToggle, - required this.isDarkMode, - }); + const HomePage({super.key}); /** * Основной метод построения интерфейса виджета. diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index 27ff562..75cda47 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -1,9 +1,34 @@ import 'package:flutter/material.dart'; -import 'package:hive_ce_flutter/hive_flutter.dart'; +import 'package:get_it/get_it.dart'; +import '../services/settings_service.dart'; -class SettingsPage extends StatelessWidget { +class SettingsPage extends StatefulWidget { const SettingsPage({super.key}); + @override + State createState() => _SettingsPageState(); +} + +class _SettingsPageState extends State { + late final SettingsService _settingsService; + + @override + void initState() { + super.initState(); + _settingsService = GetIt.instance(); + _settingsService.addListener(_onSettingsChanged); + } + + @override + void dispose() { + _settingsService.removeListener(_onSettingsChanged); + super.dispose(); + } + + void _onSettingsChanged() { + setState(() {}); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -15,18 +40,16 @@ class SettingsPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ValueListenableBuilder( - valueListenable: Hive.box('settings').listenable(), - builder: (context, box, _) { - return SwitchListTile( - title: const Text('Темная тема'), - value: box.get('darkMode', defaultValue: false), - onChanged: (value) { - box.put('darkMode', value); - }, - ); + SwitchListTile( + title: const Text('Темная тема'), + subtitle: const Text('Переключить между светлой и темной темой'), + value: _settingsService.isDarkMode, + onChanged: (value) async { + await _settingsService.setDarkMode(value); }, ), + const Divider(), + // Здесь можно добавить другие настройки ], ), ), diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart new file mode 100644 index 0000000..67ca0ed --- /dev/null +++ b/lib/services/settings_service.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:hive_ce/hive.dart'; + +class SettingsService extends ChangeNotifier { + static const String _darkModeKey = 'darkMode'; + late final Box _settingsBox; + + SettingsService() { + _settingsBox = Hive.box('settings'); + } + + bool get isDarkMode => _settingsBox.get(_darkModeKey, defaultValue: false); + + Future setDarkMode(bool value) async { + await _settingsBox.put(_darkModeKey, value); + notifyListeners(); + } + + Future toggleTheme() async { + await setDarkMode(!isDarkMode); + } +}