You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HMG_Patient_App_New/lib/widgets/accessibility/accessible_image.dart

154 lines
4.5 KiB
Dart

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<String, String>? 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,
),
);
}
}