fixes(сделал нормальную конструкцию кода, разбил все на виджеты)

This commit is contained in:
Алексей Тихоненков 2024-11-13 03:40:53 +04:00
parent 9677b03f67
commit 57c7532eb0

View File

@ -1,3 +1,5 @@
// ignore_for_file: unnecessary_string_escapes
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void main() { void main() {
@ -20,21 +22,19 @@ class MyApp extends StatelessWidget {
} }
} }
// Enum // Enum для управления состоянием сообщений
enum MessageType { noQuotes, newQuoteAdded } enum MessageType { noQuotes, newQuoteAdded }
// Модель цитаты // Модель цитаты
class Quote { class Quote {
final String text; final String text;
final String author; final String author;
Quote(this.text, this.author); Quote(this.text, this.author);
} }
// Главный экран
class MyHomePage extends StatefulWidget { class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title}); const MyHomePage({super.key, required this.title});
final String title; final String title;
@override @override
@ -42,14 +42,125 @@ class MyHomePage extends StatefulWidget {
} }
class _MyHomePageState extends State<MyHomePage> { class _MyHomePageState extends State<MyHomePage> {
List<Quote> _quotes = []; // Generics List<> final List<Quote> _quotes = [];
MessageType _messageType = MessageType.noQuotes; // Enum для состояния MessageType _messageType = MessageType.noQuotes;
// Добавление новой цитаты // Метод добавления цитаты
Future<void> _addQuote() async { Future<void> _addQuote() async {
final result = await showDialog<Map<String, String>?>( final result = await showDialog<Map<String, String>?>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) => const AddQuoteDialog(),
);
if (result != null && result['quote'] != '' && result['author'] != '') {
setState(() {
_quotes.add(
Quote(result['quote']!.addQuotesIfMissing(), result['author']!.capitalize()),
);
_messageType = MessageType.newQuoteAdded;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Stack(
children: [
Center(
child: _messageType == MessageType.noQuotes
? const NoQuotesMessage()
: QuoteList(quotes: _quotes),
),
Align(
alignment: Alignment.bottomCenter,
child: QuoteCounter(count: _quotes.length),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: _addQuote,
tooltip: 'Добавить цитату',
child: const Icon(Icons.format_quote),
),
);
}
}
// Виджет списка цитат
class QuoteList extends StatelessWidget {
final List<Quote> quotes;
const QuoteList({super.key, required this.quotes});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: quotes.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(
quotes[index].text,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w500),
),
subtitle: Text('- ${quotes[index].author}'),
);
},
);
}
}
// Виджет сообщения "нет цитат"
class NoQuotesMessage extends StatelessWidget {
const NoQuotesMessage({super.key});
@override
Widget build(BuildContext context) {
return const Text(
'Нет добавленных цитат. Добавь первую!',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18, color: Colors.grey),
);
}
}
// Виджет счетчика цитат
class QuoteCounter extends StatelessWidget {
final int count;
const QuoteCounter({super.key, required this.count});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
decoration: BoxDecoration(
color: Colors.grey.withOpacity(0.7),
borderRadius: BorderRadius.circular(15),
border: Border.all(
color: Colors.black.withOpacity(0.2),
width: 1,
),
),
child: Text(
'Количество цитат: $count',
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Colors.black),
),
),
);
}
}
// Диалоговое окно добавления цитаты
class AddQuoteDialog extends StatelessWidget {
const AddQuoteDialog({super.key});
@override
Widget build(BuildContext context) {
final TextEditingController quoteController = TextEditingController(); final TextEditingController quoteController = TextEditingController();
final TextEditingController authorController = TextEditingController(); final TextEditingController authorController = TextEditingController();
@ -73,96 +184,16 @@ class _MyHomePageState extends State<MyHomePage> {
onPressed: () => Navigator.of(context).pop({ onPressed: () => Navigator.of(context).pop({
'quote': quoteController.text, 'quote': quoteController.text,
'author': authorController.text, 'author': authorController.text,
}), // Анонимная функция }),
child: const Text('Добавить'), child: const Text('Добавить'),
), ),
], ],
); );
},
);
if (result != null && result['quote'] != '' && result['author'] != '') {
setState(() {
_quotes.add(
Quote(result['quote']!.addQuotesIfMissing(), result['author']!.capitalize()), // Применение расширения
);
_messageType = MessageType.newQuoteAdded; // Изменение состояния на "новая цитата добавлена"
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Stack(
children: [
Center(
child: _messageType == MessageType.noQuotes
? const Text(
'Нет добавленных цитат. Добавь первую!.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18, color: Colors.grey),
)
: ListView.builder(
itemCount: _quotes.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(
_quotes[index].text,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
subtitle: Text('- ${_quotes[index].author}'),
);
},
),
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.all(30.0),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 10), // Отступы внутри контейнера
decoration: BoxDecoration(
color: Colors.grey, // Полупрозрачный чёрный фон
borderRadius: BorderRadius.circular(15), // Закругленные углы
border: Border.all(//Граница
color: Colors.black.withOpacity(0.2),
width: 1,
),
),
child: Text(
'Количество цитат: ${_quotes.length}',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: Colors.black.withOpacity(0.5),
),
),
),
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: _addQuote,
tooltip: 'Добавить цитату',
child: const Icon(Icons.format_quote),
),
);
} }
} }
// Расширение для форматирования текста // Расширение для форматирования текста
extension StringExtension on String { extension StringExtension on String {
// Метод для заглавной буквы у каждого слова
String capitalize() { String capitalize() {
return split(' ').map((word) { return split(' ').map((word) {
if (word.isNotEmpty) { if (word.isNotEmpty) {
@ -171,19 +202,11 @@ extension StringExtension on String {
return word; return word;
}).join(' '); }).join(' ');
} }
// Метод для добавления кавычек, если их нет или они размещены некорректно
String addQuotesIfMissing() { String addQuotesIfMissing() {
if (startsWith('\"') && endsWith('\"')) { if (startsWith('\"') && endsWith('\"')) return this;
return this; if (startsWith('\"') && !endsWith('\"')) return '$this\"';
} if (endsWith('\"') && !startsWith('\"')) return '\"$this';
// Если начинается с кавычки, но не заканчивается на неё
if (startsWith('\"') && !endsWith('\"')) {
return '$this\"';
}
// Если заканчивается на кавычку, но не начинается с неё
if (endsWith('\"') && !startsWith('\"')) {
return '\"$this';
}
return '\"$this\"'; return '\"$this\"';
} }
} }