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.
154 lines
4.5 KiB
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,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|