part of 'home_page.dart'; typedef OnLikeCallback = void Function(String? id, String title, bool isLiked)?; typedef OnDeleteCallback = void Function(String? id, String title)?; class _Card extends StatelessWidget { final String text; final String descriptionText; final IconData icon; final String? imageUrl; final OnLikeCallback onLike; final OnDeleteCallback onDelete; final VoidCallback? onTap; final String? id; final bool isLiked; const _Card( this.text, { this.icon = Icons.ac_unit_outlined, required this.descriptionText, this.imageUrl, this.onLike, this.onDelete, this.onTap, this.id, this.isLiked = false, }); factory _Card.fromData( CardData data, { OnLikeCallback onLike, OnDeleteCallback onDelete, VoidCallback? onTap, bool isLiked = false, }) => _Card( data.text, descriptionText: data.descriptionText, icon: data.icon, imageUrl: data.imageUrl, onLike: onLike, onDelete: onDelete, onTap: onTap, isLiked: isLiked, id: data.id, ); @override Widget build(BuildContext context) { return GestureDetector( onTap: onTap, onDoubleTap: () => onLike?.call(id, text, isLiked), child: Container( margin: const EdgeInsets.all(16), constraints: const BoxConstraints(minHeight: 170), decoration: BoxDecoration( color: Colors.grey, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(.5), spreadRadius: 4, offset: const Offset(0, 5), blurRadius: 8, ), ], ), child: IntrinsicHeight( child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 10, top: 10, right: 3, bottom: 10), child: ClipRRect( borderRadius: BorderRadius.circular(15), child: SizedBox( height: double.infinity, width: 150, child: Image.network( imageUrl ?? '', fit: BoxFit.cover, errorBuilder: (_, __, ___) => const Placeholder(), ), ), ), ), Expanded( child: Stack( children: [ Padding( padding: const EdgeInsets.only(left: 3.0, top: 3.0), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( text, style: const TextStyle( color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold, ), ), Text( descriptionText, style: const TextStyle( color: Colors.white, fontSize: 13, ), ), ]), ), ], )), Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( onTap: () => onDelete?.call(id, text), child: Padding( padding: const EdgeInsets.all(10.0), child: Icon( icon, ), ), ), Padding( padding: const EdgeInsets.all(10.0), child: GestureDetector( onTap: () => onLike?.call(id, text, isLiked), child: AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: isLiked ? const Icon( Icons.check_box_rounded, color: Colors.redAccent, key: ValueKey(0), ) : const Icon( Icons.check_box, key: ValueKey(1), ), ), ), ), ], ), ], ), ), ), ); } }