part of '../../Presentation/home_page/home_page.dart'; class CardData { final String text; final String info; final String? urlImage; CardData({required this.text, required this.info, required this.urlImage}); } class MyCard extends StatefulWidget { final String text; final String info; final String? urlImage; final VoidCallback? onLike; const MyCard({super.key, required this.text, required this.info, required this.urlImage, this.onLike}); factory MyCard.fromData(CardData data, {VoidCallback? onLike}) => MyCard( text: data.text, info: data.info, urlImage: data.urlImage, onLike: onLike, ); @override State createState() => _MyCardState(); } class _MyCardState extends State { bool isLiked = false; @override Widget build(BuildContext context) { return GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DetailPage(info: widget.info, imgUrl: widget.urlImage), ), ); }, child: Card( elevation: 4.0, margin: const EdgeInsets.all(10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Stack( children: [ Image.network( widget.urlImage ?? 'https://hlebzavod3.ru/images/virtuemart/product/011_IMG_9657.jpg', fit: BoxFit.cover, height: 150.0, width: double.infinity, ), Positioned( top: 8.0, right: 8.0, child: GestureDetector( onTap: () { setState(() { isLiked = !isLiked; }); if(isLiked) widget.onLike?.call(); }, child: Icon( Icons.favorite, color: isLiked ? Colors.red : Colors.blueGrey, size: 30.0, ), ), ), ], ), Padding( padding: const EdgeInsets.all(10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.text, style: const TextStyle( fontSize: 18.0, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 5.0), Text( widget.info, style: const TextStyle( fontSize: 14.0, color: Colors.grey, ), ), ], ), ), ], ), ), ); } }