[FEAT] working on the image widget for dynamic memory management and caching.

This commit is contained in:
2025-09-12 19:08:01 -04:00
parent 272a62b70c
commit 59915852bc

View File

@@ -76,7 +76,7 @@ class AstromicImage extends StatelessWidget {
this.blendMode, this.blendMode,
this.fadeInCurve, this.fadeInCurve,
this.fadeInDuration, this.fadeInDuration,
this.imageQuality = 0.35, this.imageQuality = 0.5,
// //
this.svgColor, this.svgColor,
// //
@@ -291,14 +291,19 @@ class AstromicImage extends StatelessWidget {
} }
} }
// Build image provider and ensure it's resized to (or near) the rendering size.
// Build image provider and ensure it's resized to (or near) the rendering size. ImageProvider _imageProvider(
ImageProvider _imageProvider(_DeclaredAssetType type, dynamic ref, Size size, double imageQuality) { _DeclaredAssetType type,
dynamic ref,
Size size,
double imageQuality,
) {
// imageQuality is used as a downscale factor: 1.0 -> full target resolution, 0.5 -> half resolution // imageQuality is used as a downscale factor: 1.0 -> full target resolution, 0.5 -> half resolution
final double factor = imageQuality.clamp(0.1, 1.0); final double factor = imageQuality.clamp(0.1, 1.0);
// If size is infinite for a dimension, we skip resize for that dim (pass 0) // If size is infinite for a dimension, we skip resize for that dim (pass 0)
final int? targetWidth = size.width.isFinite ? (size.width * factor).clamp(1, 10000).toInt() : null; final int? targetWidth = size.width.isFinite ? (size.width * factor).clamp(1, 4096).toInt() : null;
final int? targetHeight = size.height.isFinite ? (size.height * factor).clamp(1, 10000).toInt() : null; final int? targetHeight = size.height.isFinite ? (size.height * factor).clamp(1, 4096).toInt() : null;
ImageProvider baseProvider; ImageProvider baseProvider;
switch (type) { switch (type) {
@@ -309,17 +314,22 @@ class AstromicImage extends StatelessWidget {
baseProvider = MemoryImage(ref as Uint8List); baseProvider = MemoryImage(ref as Uint8List);
break; break;
case _DeclaredAssetType.path: case _DeclaredAssetType.path:
baseProvider = AssetImage(ref as String);
break;
case _DeclaredAssetType.fallback: case _DeclaredAssetType.fallback:
baseProvider = AssetImage(ref as String); baseProvider = AssetImage(ref as String);
break; break;
} }
// If both target dims are null (infinite), return base provider (no resize). // ✅ Skip resizing for AssetImage (Flutter handles resolution variants)
if (targetWidth == null && targetHeight == null) return baseProvider; if (baseProvider is AssetImage) {
return baseProvider;
}
// If one of them is null, supply 0 for that dim to ResizeImage (it will only respect non-zero dim). // If both target dims are null (infinite), return base provider (no resize).
if (targetWidth == null && targetHeight == null) {
return baseProvider;
}
// If one of them is null, supply 0 for that dim (ResizeImage respects non-zero dim).
final int w = targetWidth ?? 0; final int w = targetWidth ?? 0;
final int h = targetHeight ?? 0; final int h = targetHeight ?? 0;