lab2 done
This commit is contained in:
parent
7ad1ef78d3
commit
9677b03f67
162
lib/main.dart
162
lib/main.dart
@ -10,21 +10,31 @@ class MyApp extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
title: 'Тихоненков Алексей',
|
title: 'Цитаты',
|
||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
),
|
),
|
||||||
home: const MyHomePage(title: 'Тихоненков Алексей Пибд-33'),
|
home: const MyHomePage(title: 'Цитаты'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enum
|
||||||
|
enum MessageType { noQuotes, newQuoteAdded }
|
||||||
|
|
||||||
|
// Модель цитаты
|
||||||
|
class Quote {
|
||||||
|
final String text;
|
||||||
|
final String 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
|
||||||
@ -32,14 +42,54 @@ class MyHomePage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MyHomePageState extends State<MyHomePage> {
|
class _MyHomePageState extends State<MyHomePage> {
|
||||||
int _counter = 0;
|
List<Quote> _quotes = []; // Generics List<>
|
||||||
|
MessageType _messageType = MessageType.noQuotes; // Enum для состояния
|
||||||
|
|
||||||
void _incrementCounter() {
|
// Добавление новой цитаты
|
||||||
|
Future<void> _addQuote() async {
|
||||||
|
final result = await showDialog<Map<String, String>?>(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
final TextEditingController quoteController = TextEditingController();
|
||||||
|
final TextEditingController authorController = TextEditingController();
|
||||||
|
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text('Добавить цитату'),
|
||||||
|
content: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
TextField(
|
||||||
|
controller: quoteController,
|
||||||
|
decoration: const InputDecoration(labelText: 'Цитата'),
|
||||||
|
),
|
||||||
|
TextField(
|
||||||
|
controller: authorController,
|
||||||
|
decoration: const InputDecoration(labelText: 'Автор'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop({
|
||||||
|
'quote': quoteController.text,
|
||||||
|
'author': authorController.text,
|
||||||
|
}), // Анонимная функция
|
||||||
|
child: const Text('Добавить'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result != null && result['quote'] != '' && result['author'] != '') {
|
||||||
setState(() {
|
setState(() {
|
||||||
_counter++;
|
_quotes.add(
|
||||||
|
Quote(result['quote']!.addQuotesIfMissing(), result['author']!.capitalize()), // Применение расширения
|
||||||
|
);
|
||||||
|
_messageType = MessageType.newQuoteAdded; // Изменение состояния на "новая цитата добавлена"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -48,24 +98,92 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
||||||
title: Text(widget.title),
|
title: Text(widget.title),
|
||||||
),
|
),
|
||||||
body: Center(
|
body: Stack(
|
||||||
child: Column(
|
children: [
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
Center(
|
||||||
children: <Widget>[
|
child: _messageType == MessageType.noQuotes
|
||||||
const Text(
|
? const Text(
|
||||||
'You have pushed the button this many times:',
|
'Нет добавленных цитат. Добавь первую!.',
|
||||||
|
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,
|
||||||
),
|
),
|
||||||
Text(
|
|
||||||
'$_counter',
|
|
||||||
style: Theme.of(context).textTheme.headlineMedium,
|
|
||||||
),
|
),
|
||||||
|
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(
|
floatingActionButton: FloatingActionButton(
|
||||||
onPressed: _incrementCounter,
|
onPressed: _addQuote,
|
||||||
tooltip: 'Increment',
|
tooltip: 'Добавить цитату',
|
||||||
child: const Icon(Icons.add),
|
child: const Icon(Icons.format_quote),
|
||||||
), );
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Расширение для форматирования текста
|
||||||
|
extension StringExtension on String {
|
||||||
|
// Метод для заглавной буквы у каждого слова
|
||||||
|
String capitalize() {
|
||||||
|
return split(' ').map((word) {
|
||||||
|
if (word.isNotEmpty) {
|
||||||
|
return '${word[0].toUpperCase()}${word.substring(1).toLowerCase()}';
|
||||||
|
}
|
||||||
|
return word;
|
||||||
|
}).join(' ');
|
||||||
|
}
|
||||||
|
// Метод для добавления кавычек, если их нет или они размещены некорректно
|
||||||
|
String addQuotesIfMissing() {
|
||||||
|
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