From 6b8d71fc3d7d79621114c0e8e008978a5de2986d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=B0?= <Вера@DESKTOP-7L4BKCB> Date: Wed, 18 Dec 2024 13:16:56 +0400 Subject: [PATCH] lab-5 50 --- lib/presentation/dialogs/error_dialog.dart | 33 +++++++++ lib/presentation/dialogs/show_dialog.dart | 12 +++ lib/presentation/home_page/card.dart | 20 +---- lib/presentation/home_page/home_page.dart | 86 ++++++++++++++-------- 4 files changed, 101 insertions(+), 50 deletions(-) create mode 100644 lib/presentation/dialogs/error_dialog.dart create mode 100644 lib/presentation/dialogs/show_dialog.dart diff --git a/lib/presentation/dialogs/error_dialog.dart b/lib/presentation/dialogs/error_dialog.dart new file mode 100644 index 0000000..ccfe5fc --- /dev/null +++ b/lib/presentation/dialogs/error_dialog.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class ErrorDialog extends StatelessWidget { + final String? error; + const ErrorDialog(this.error, {super.key}); + @override + Widget build(BuildContext context) { + return Center( + child: Material( + color: Colors.transparent, + child: Container( + margin: const EdgeInsets.all(36), + padding: const EdgeInsets.all(20), + decoration: const BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.error, color: Colors.white), + const SizedBox(height: 12), + Text( + error ?? 'UNKNOWN', + style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: Colors.white), + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/presentation/dialogs/show_dialog.dart b/lib/presentation/dialogs/show_dialog.dart new file mode 100644 index 0000000..6c37a50 --- /dev/null +++ b/lib/presentation/dialogs/show_dialog.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:leonteva_pmu/presentation/dialogs/error_dialog.dart'; + +void showErrorDialog( + BuildContext context, { + required String? error, + }) { + showDialog( + context: context, + builder: (_) => ErrorDialog(error), + ); +} \ No newline at end of file diff --git a/lib/presentation/home_page/card.dart b/lib/presentation/home_page/card.dart index 3221934..0b4a7b0 100644 --- a/lib/presentation/home_page/card.dart +++ b/lib/presentation/home_page/card.dart @@ -80,25 +80,7 @@ class _CardState extends State<_Card> { errorBuilder: (_, __, ___) => const Placeholder(), ), ), - Align( - alignment: Alignment.bottomLeft, - child: Container( - decoration: const BoxDecoration( - color: Colors.orangeAccent, - borderRadius: BorderRadius.only( - topRight: Radius.circular(20), - // - )), - padding: const EdgeInsets.fromLTRB(8, 2, 8, 2), - child: Text( - 'скидок нет', - style: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith(color: Colors.black), - ), - ), - ), + ], ), ), diff --git a/lib/presentation/home_page/home_page.dart b/lib/presentation/home_page/home_page.dart index c737eee..af15463 100644 --- a/lib/presentation/home_page/home_page.dart +++ b/lib/presentation/home_page/home_page.dart @@ -33,38 +33,62 @@ class Body extends StatelessWidget { const Body({super.key}); // ключи @override - Widget build(BuildContext context) { - final data = [ - CardData('dish', - descriptionText: 'delicious', - icon: Icons.abc, - imageUrl: - 'https://n1s2.hsmedia.ru/48/2d/63/482d63d02b668677a73a2ffbd791a71b/728x546_1_aaca034dfa8a8c33247bd8cb2ed26817@1700x1275_0xac120003_9749770561671744766.jpeg'), - CardData('dish2', - descriptionText: 'yes', - icon: Icons.access_alarm_outlined, - imageUrl: - 'https://n1s2.hsmedia.ru/48/2d/63/482d63d02b668677a73a2ffbd791a71b/728x546_1_aaca034dfa8a8c33247bd8cb2ed26817@1700x1275_0xac120003_9749770561671744766.jpeg'), - CardData('dish3', - descriptionText: 'eeee', - icon: Icons.access_alarm_rounded, - imageUrl: - 'https://n1s2.hsmedia.ru/48/2d/63/482d63d02b668677a73a2ffbd791a71b/728x546_1_aaca034dfa8a8c33247bd8cb2ed26817@1700x1275_0xac120003_9749770561671744766.jpeg'), - ]; + State createState() => _BodyState(); + } - return Center( - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: data.map((data) { - return _Card.fromData( - data, - onLike: (String title, bool isLiked) => - _showSnackBar(context, title, isLiked), - onTap: () => _navToDetails(context, data), - ); - }).toList(), - ), +class _BodyState extends State { + final searchController = TextEditingController(); + late Future?> data; + + final repo = PotterRepository(); + + @override + void initState() { + data = repo.loadData(onError: (e) => showErrorDialog(context, error: e)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(12), + child: CupertinoSearchTextField( + controller: searchController, + onChanged: (search) { + setState(() { + data = repo.loadData(q: search); + }); + }, + ), + ), + Expanded( + child: Center( + child: FutureBuilder?>( + future: data, + builder: (context, snapshot) => SingleChildScrollView( + child: snapshot.hasData + ? Column( + mainAxisAlignment: MainAxisAlignment.center, + children: snapshot.data?.map((data) { + return _Card.fromData( + data, + onLike: (String title, bool isLiked) => + _showSnackBar(context, title, isLiked), + onTap: () => _navToDetails(context, data), + ); + }).toList() ?? + [], + ) + : const CircularProgressIndicator(), + ), + ), + ), + ), + ], ), ); }