import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/widgets/accessibility/preserve_image_colors.dart'; /// Custom Image widget that automatically preserves original colors /// when accessibility visual modes are active. /// /// Usage: Replace Image.network() with AccessibleImage.network() /// Replace Image.asset() with AccessibleImage.asset() class AccessibleImage extends StatelessWidget { final ImageProvider image; final double? width; final double? height; final BoxFit? fit; final AlignmentGeometry alignment; final ImageRepeat repeat; final Color? color; final BlendMode? colorBlendMode; final FilterQuality filterQuality; final Widget Function(BuildContext, Widget, int?, bool)? frameBuilder; final Widget Function(BuildContext, Object, StackTrace?)? errorBuilder; final String? semanticLabel; final bool excludeFromSemantics; final bool gaplessPlayback; final bool isAntiAlias; const AccessibleImage({ super.key, required this.image, this.width, this.height, this.fit, this.alignment = Alignment.center, this.repeat = ImageRepeat.noRepeat, this.color, this.colorBlendMode, this.filterQuality = FilterQuality.low, this.frameBuilder, this.errorBuilder, this.semanticLabel, this.excludeFromSemantics = false, this.gaplessPlayback = false, this.isAntiAlias = false, }); /// Creates an accessible image from a network URL factory AccessibleImage.network( String src, { Key? key, double? width, double? height, BoxFit? fit, AlignmentGeometry alignment = Alignment.center, ImageRepeat repeat = ImageRepeat.noRepeat, Color? color, BlendMode? colorBlendMode, FilterQuality filterQuality = FilterQuality.low, Widget Function(BuildContext, Widget, int?, bool)? frameBuilder, Widget Function(BuildContext, Object, StackTrace?)? errorBuilder, String? semanticLabel, bool excludeFromSemantics = false, bool gaplessPlayback = false, bool isAntiAlias = false, Map? headers, int? cacheWidth, int? cacheHeight, }) { return AccessibleImage( key: key, image: NetworkImage(src, headers: headers), width: width, height: height, fit: fit, alignment: alignment, repeat: repeat, color: color, colorBlendMode: colorBlendMode, filterQuality: filterQuality, frameBuilder: frameBuilder, errorBuilder: errorBuilder, semanticLabel: semanticLabel, excludeFromSemantics: excludeFromSemantics, gaplessPlayback: gaplessPlayback, isAntiAlias: isAntiAlias, ); } /// Creates an accessible image from an asset factory AccessibleImage.asset( String name, { Key? key, AssetBundle? bundle, double? width, double? height, BoxFit? fit, AlignmentGeometry alignment = Alignment.center, ImageRepeat repeat = ImageRepeat.noRepeat, Color? color, BlendMode? colorBlendMode, FilterQuality filterQuality = FilterQuality.low, Widget Function(BuildContext, Widget, int?, bool)? frameBuilder, Widget Function(BuildContext, Object, StackTrace?)? errorBuilder, String? semanticLabel, bool excludeFromSemantics = false, bool gaplessPlayback = false, bool isAntiAlias = false, String? package, int? cacheWidth, int? cacheHeight, }) { return AccessibleImage( key: key, image: AssetImage(name, bundle: bundle, package: package), width: width, height: height, fit: fit, alignment: alignment, repeat: repeat, color: color, colorBlendMode: colorBlendMode, filterQuality: filterQuality, frameBuilder: frameBuilder, errorBuilder: errorBuilder, semanticLabel: semanticLabel, excludeFromSemantics: excludeFromSemantics, gaplessPlayback: gaplessPlayback, isAntiAlias: isAntiAlias, ); } @override Widget build(BuildContext context) { return PreserveImageColors( child: Image( image: image, width: width, height: height, fit: fit, alignment: alignment, repeat: repeat, color: color, colorBlendMode: colorBlendMode, filterQuality: filterQuality, frameBuilder: frameBuilder, errorBuilder: errorBuilder, semanticLabel: semanticLabel, excludeFromSemantics: excludeFromSemantics, gaplessPlayback: gaplessPlayback, isAntiAlias: isAntiAlias, ), ); } }