import 'package:flutter/material.dart'; class PokemonImage extends StatelessWidget { final String imageUrl; final String? fallbackUrl; final BoxFit fit; final double? width; final double? height; final Color? color; final BlendMode? colorBlendMode; const PokemonImage({ super.key, required this.imageUrl, this.fallbackUrl, this.fit = BoxFit.contain, this.width, this.height, this.color, this.colorBlendMode, }); @override Widget build(BuildContext context) { return Image.network( imageUrl, fit: fit, width: width, height: height, color: color, colorBlendMode: colorBlendMode, errorBuilder: (context, error, stackTrace) { // If the primary image fails and we have a fallback, try the fallback if (fallbackUrl != null && fallbackUrl != imageUrl) { return Image.network( fallbackUrl!, fit: fit, width: width, height: height, color: color, colorBlendMode: colorBlendMode, errorBuilder: (context, error, stackTrace) { // If the fallback also fails, show a placeholder return _buildPlaceholder(); }, ); } // No fallback, show placeholder return _buildPlaceholder(); }, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress == null) return child; return Center( child: CircularProgressIndicator( value: loadingProgress.expectedTotalBytes != null ? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes! : null, ), ); }, ); } Widget _buildPlaceholder() { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.help_outline, size: (width ?? 40) * 0.5, color: Colors.grey[400], ), if ((width ?? 100) > 60) Text( "Not Found", style: TextStyle( color: Colors.grey[600], fontSize: 10, fontWeight: FontWeight.bold, ), ), ], ), ); } }