import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:laba1/data/repositories/potter_repository.dart'; import 'package:laba1/presentation/details_page/details_page.dart'; import '../../data/repositories/mock_repository.dart'; import '../../domain/models/card.dart'; import '../dialogs/show_dialog.dart'; part 'card.dart'; class MyHomePage extends StatelessWidget { const MyHomePage({super.key, required this.title}); final String title; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(title), backgroundColor: Colors.amber, ), backgroundColor: Colors.yellow, body: const Body()); } } class Body extends StatefulWidget { const Body({Key? key}) : super(key: key); @override State createState() => _BodyState(); } class _BodyState extends State { final searchController = TextEditingController(); late Future?> data; final repo = PotterRepository(); @override Widget build(BuildContext context) { data = repo.loadData( onError: (e) => showErrorDialog(context, error: e), ); return Center( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ CupertinoSearchTextField( controller: searchController, onChanged: (search) { setState(() {}); data = repo.loadData( q: search, onError: (e) => showErrorDialog(context, error: e), ); }, ), FutureBuilder?>( future: data, builder: (context, snapshot) => snapshot.hasData ? Column( mainAxisAlignment: MainAxisAlignment.center, children: snapshot.data ?.map((e) => _Card.fromData( e, onLike: (bool isLiked) { _showSnackBar(context, isLiked); }, onTap: () => _navToDetails(context, e), )) .toList() ?? [], ) : const CircularProgressIndicator(), ), ], ), ), ); } void _navToDetails(BuildContext context, CardData data) { Navigator.push( context, CupertinoPageRoute(builder: (context) => DetailsPage(data)), ); } void _showSnackBar(BuildContext context, bool isLiked) { WidgetsBinding.instance.addPostFrameCallback((_) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( 'Card ${isLiked ? 'liked' : 'unliked'}', style: Theme.of(context).textTheme.bodyLarge, ), backgroundColor: Colors.orangeAccent, duration: const Duration(seconds: 1), )); }); } }