feat: добавить черно-белые темы и упростить main.dart
This commit is contained in:
+13
-73
@@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user