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(); bool isLoading = false; @override void initState() { data = repo.loadData(onError: (e) => showErrorDialog(context, error: e)); isLoading = true; data.then((_) => setState(() { isLoading = false; // Остановить индикатор при завершении загрузки })); super.initState(); } @override Widget build(BuildContext context) { return Center( child: Stack( children: [ Positioned.fill( child: FutureBuilder?>( future: data, builder: (context, snapshot) { var cards = Column( children: [], ); cards.children.add(Padding( padding: const EdgeInsets.only(left: 8.0, right: 8), child: CupertinoSearchTextField( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20), ), backgroundColor: Colors.amberAccent, ), )); cards.children.addAll( snapshot.data ?.map((e) => _Card.fromData( e, onLike: (bool isLiked) { _showSnackBar(context, isLiked); }, onTap: () => _navToDetails(context, e), )) .toList() ?? [], ); return !isLoading ? SingleChildScrollView( child: cards, ) : Center(child: CircularProgressIndicator()); }, ), ), Align( alignment: Alignment.topCenter, child: Padding( padding: const EdgeInsets.only(left: 8.0, right: 8), child: CupertinoSearchTextField( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20), ), backgroundColor: Colors.amberAccent, controller: searchController, onChanged: (search) { setState(() { isLoading = true; }); setState(() { data = repo.loadData( q: search, onError: (e) => showErrorDialog(context, error: e), ); data.then((_) => setState(() { isLoading = false; // Остановить индикатор при завершении загрузки })); }); }, ), ), ), ], ), ); } 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), )); }); } }