feat: добавить черно-белые темы и упростить main.dart

This commit is contained in:
2025-06-09 14:38:23 +03:00
parent 6d32275e18
commit 4dbdafe048
2 changed files with 93 additions and 73 deletions
+13 -73
View File
@@ -1,81 +1,43 @@
import 'package:flutter/material.dart';
import 'theme/app_theme.dart';
// Главная функция - точка входа в приложение
// runApp() запускает Flutter приложение и принимает корневой виджет
void main() {
// Создаем экземпляр MyApp и передаем null как database (заглушка)
runApp(MyApp(database: null));
runApp(const MyApp());
}
// MyApp - корневой виджет приложения
// StatefulWidget означает, что виджет может изменять свое состояние
class MyApp extends StatefulWidget {
// Конструктор принимает database как параметр
// final означает, что значение нельзя изменить после создания
final dynamic database;
const MyApp({super.key, required this.database});
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
// Состояние для MyApp виджета
// Здесь хранятся изменяемые данные и логика
class _MyAppState extends State<MyApp> {
// Переменная для отслеживания текущей темы
// _ в начале означает, что переменная приватная (доступна только в этом классе)
bool _isDarkMode = false;
// Метод для переключения темы
void toggleTheme() {
// setState() сообщает Flutter, что состояние изменилось
// и нужно перерисовать виджет
setState(() {
_isDarkMode = !_isDarkMode; // Инвертируем значение
_isDarkMode = !_isDarkMode;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Budget App', // Название приложения
// Светлая тема - используется когда _isDarkMode = false
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.light, // Явно указываем светлую тему
),
useMaterial3: true, // Используем Material Design 3
),
// Темная тема - используется когда _isDarkMode = true
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.dark, // Явно указываем темную тему
),
useMaterial3: true,
),
// Определяем какую тему использовать на основе _isDarkMode
title: 'Budget App',
theme: AppTheme.lightTheme(),
darkTheme: AppTheme.darkTheme(),
themeMode: _isDarkMode ? ThemeMode.dark : ThemeMode.light,
// Главная страница приложения
home: HomePage(
onThemeToggle: toggleTheme, // Передаем функцию переключения темы
isDarkMode: _isDarkMode, // Передаем текущее состояние темы
onThemeToggle: toggleTheme,
isDarkMode: _isDarkMode,
),
);
}
}
// Главная страница приложения
class HomePage extends StatelessWidget {
// Функция обратного вызова для переключения темы
final VoidCallback onThemeToggle;
// Текущее состояние темы
final bool isDarkMode;
const HomePage({
@@ -86,48 +48,26 @@ class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Scaffold - это базовая структура страницы в Material Design
// Он предоставляет готовый каркас с местами для основных элементов:
// - appBar (верхняя панель)
// - body (основное содержимое)
// - bottomNavigationBar (нижняя навигация)
// - floatingActionButton (плавающая кнопка действия)
// - drawer (боковое меню) и другие
return Scaffold(
// AppBar - верхняя панель приложения
appBar: AppBar(
title: const Text('Budget App'),
// Кнопка для переключения темы в AppBar
actions: [
IconButton(
// Меняем иконку в зависимости от текущей темы
icon: Icon(isDarkMode ? Icons.light_mode : Icons.dark_mode),
onPressed: onThemeToggle, // Вызываем функцию переключения темы
tooltip: 'Переключить тему', // Подсказка при долгом нажатии
onPressed: onThemeToggle,
tooltip: 'Переключить тему',
),
],
),
// Основное содержимое страницы
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.account_balance_wallet,
size: 64,
),
SizedBox(height: 16), // Отступ между элементами
Icon(Icons.account_balance_wallet, size: 64),
SizedBox(height: 16),
Text(
'Добро пожаловать в Budget App!',
style: TextStyle(fontSize: 24),
textAlign: TextAlign.center,
),
SizedBox(height: 8),
Text(
'Здесь будет основной контент приложения',
style: TextStyle(fontSize: 16),
textAlign: TextAlign.center,
),
],
),
+80
View File
@@ -0,0 +1,80 @@
import 'package:flutter/material.dart';
class AppTheme {
// Светлая тема в черно-белой гамме
static ThemeData lightTheme() {
return ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.grey, // Серый как базовый цвет
brightness: Brightness.light,
primary: Colors.black, // Основной цвет - черный
secondary: Colors.grey[800]!, // Вторичный цвет - темно-серый
surface: Colors.white, // Фон поверхностей
background: Colors.grey[50]!, // Общий фон - очень светлый серый
),
appBarTheme: const AppBarTheme(
backgroundColor: Colors.white, // Белый фон AppBar
foregroundColor: Colors.black, // Черный цвет иконок и текста
elevation: 0, // Убираем тень
centerTitle: true, // Центрируем заголовок
),
cardTheme: CardTheme(
elevation: 1, // Легкая тень
margin: const EdgeInsets.all(8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: Colors.black, // Черные кнопки
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
);
}
// Темная тема в черно-белой гамме
static ThemeData darkTheme() {
return ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.grey,
brightness: Brightness.dark,
primary: Colors.white, // Основной цвет - белый
secondary: Colors.grey[300]!, // Вторичный цвет - светлый серый
surface: Colors.grey[900]!, // Фон поверхностей
background: Colors.black, // Общий фон - черный
),
appBarTheme: AppBarTheme(
backgroundColor: Colors.grey[900]!, // Темно-серый фон AppBar
foregroundColor: Colors.white, // Белый цвет иконок и текста
elevation: 0,
centerTitle: true,
),
cardTheme: CardTheme(
elevation: 1,
margin: const EdgeInsets.all(8),
color: Colors.grey[800], // Темные карточки
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
foregroundColor: Colors.black,
backgroundColor: Colors.white, // Белые кнопки
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
);
}
}