part of 'home_page.dart'; typedef OnLikeCallback = void Function(String? id, String title, bool isLiked)?; class _Card extends StatelessWidget { final String text; final String descriptionText; final String? fullName; final IconData icon; final String? imageUrl; final OnLikeCallback onLike; final VoidCallback? onTap; final String? id; final bool isLiked; const _Card( this.text, { this.icon = Icons.catching_pokemon, required this.descriptionText, required this.fullName, this.imageUrl, this.onLike, this.onTap, this.id, this.isLiked = false, }); factory _Card.fromData( CardData data, { OnLikeCallback onLike, VoidCallback? onTap, bool isLiked = false, }) => _Card( data.text, descriptionText: data.descriptionText, fullName: data.fullName, icon: data.icon, imageUrl: data.imageUrl, onLike: onLike, onTap: onTap, isLiked: isLiked, id: data.id.toString() ); @override Widget build(BuildContext context) { return GestureDetector( onTap: onTap, child: Card( margin: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(15), child: SizedBox( height: 250, width: double.infinity, child: Image.network( imageUrl ?? '', fit: BoxFit.cover, errorBuilder: (_, __, ___) => const Placeholder(), ), ), ), Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( fullName ?? 'Default Name', style: Theme.of(context).textTheme.bodyLarge?.copyWith( fontSize: 20.0, fontFamily: 'Times New Roman', ), ), Text( descriptionText, style: Theme.of(context).textTheme.bodyMedium, ), ], ), ), Align( alignment: Alignment.bottomRight, child: Padding( padding: const EdgeInsets.only( left: 8.0, right: 16.0, bottom: 16.0, ), child: GestureDetector( onTap: () => onLike?.call(id, text, isLiked), child: AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: isLiked ? const Icon( Icons.favorite, color: Colors.redAccent, key: ValueKey(0), ) : const Icon( Icons.favorite_border, key: ValueKey(1), ), ), ), ), ), ], ), ), ); } }