fixes(сделал нормальную конструкцию кода, разбил все на виджеты)
This commit is contained in:
parent
9677b03f67
commit
57c7532eb0
225
lib/main.dart
225
lib/main.dart
@ -1,3 +1,5 @@
|
||||
// ignore_for_file: unnecessary_string_escapes
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
void main() {
|
||||
@ -20,21 +22,19 @@ class MyApp extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
// Enum
|
||||
// Enum для управления состоянием сообщений
|
||||
enum MessageType { noQuotes, newQuoteAdded }
|
||||
|
||||
// Модель цитаты
|
||||
class Quote {
|
||||
final String text;
|
||||
final String author;
|
||||
|
||||
Quote(this.text, this.author);
|
||||
}
|
||||
|
||||
|
||||
// Главный экран
|
||||
class MyHomePage extends StatefulWidget {
|
||||
const MyHomePage({super.key, required this.title});
|
||||
|
||||
final String title;
|
||||
|
||||
@override
|
||||
@ -42,14 +42,125 @@ class MyHomePage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _MyHomePageState extends State<MyHomePage> {
|
||||
List<Quote> _quotes = []; // Generics List<>
|
||||
MessageType _messageType = MessageType.noQuotes; // Enum для состояния
|
||||
final List<Quote> _quotes = [];
|
||||
MessageType _messageType = MessageType.noQuotes;
|
||||
|
||||
// Добавление новой цитаты
|
||||
// Метод добавления цитаты
|
||||
Future<void> _addQuote() async {
|
||||
final result = await showDialog<Map<String, String>?>(
|
||||
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 authorController = TextEditingController();
|
||||
|
||||
@ -73,96 +184,16 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
onPressed: () => Navigator.of(context).pop({
|
||||
'quote': quoteController.text,
|
||||
'author': authorController.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 {
|
||||
// Метод для заглавной буквы у каждого слова
|
||||
String capitalize() {
|
||||
return split(' ').map((word) {
|
||||
if (word.isNotEmpty) {
|
||||
@ -171,19 +202,11 @@ extension StringExtension on String {
|
||||
return word;
|
||||
}).join(' ');
|
||||
}
|
||||
// Метод для добавления кавычек, если их нет или они размещены некорректно
|
||||
|
||||
String addQuotesIfMissing() {
|
||||
if (startsWith('\"') && endsWith('\"')) {
|
||||
return this;
|
||||
}
|
||||
// Если начинается с кавычки, но не заканчивается на неё
|
||||
if (startsWith('\"') && !endsWith('\"')) {
|
||||
return '$this\"';
|
||||
}
|
||||
// Если заканчивается на кавычку, но не начинается с неё
|
||||
if (endsWith('\"') && !startsWith('\"')) {
|
||||
return '\"$this';
|
||||
}
|
||||
if (startsWith('\"') && endsWith('\"')) return this;
|
||||
if (startsWith('\"') && !endsWith('\"')) return '$this\"';
|
||||
if (endsWith('\"') && !startsWith('\"')) return '\"$this';
|
||||
return '\"$this\"';
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user