OptimizedArtworkData class

An optimized version of ArtworkData with advanced memory management features.

OptimizedArtworkData extends the basic ArtworkData functionality with:

  • Automatic caching with memory pressure handling
  • Streaming support for very large images
  • Compression for memory efficiency
  • Smart loading strategies based on image size
  • Performance monitoring and metrics

This class is designed for applications that need to handle large numbers of artwork images efficiently while minimizing memory usage.

Features

  • Smart Loading: Automatically chooses between lazy, streaming, or cached loading
  • Memory Optimization: Uses compression and caching to minimize memory footprint
  • Size-Based Strategy: Different handling for small, medium, and large artwork
  • Performance Tracking: Monitors loading times and cache effectiveness
  • Backward Compatibility: Drop-in replacement for standard ArtworkData

Usage Examples

Basic Usage (Drop-in Replacement)

final optimizedArtwork = OptimizedArtworkData(
  mimeType: 'image/jpeg',
  type: ArtworkType.frontCover,
  description: 'Album cover',
  dataLoader: () => loadImageBytes(),
);

// Works exactly like ArtworkData
final imageBytes = await optimizedArtwork.data;

With Custom Cache

final cache = ArtworkCache(maxMemoryBytes: 100 * 1024 * 1024);

final artwork = OptimizedArtworkData(
  mimeType: 'image/png',
  type: ArtworkType.frontCover,
  dataLoader: () => loadImageBytes(),
  cache: cache,
  cacheKey: 'album_123_cover',
);

Streaming Large Images

final largeArtwork = OptimizedArtworkData(
  mimeType: 'image/jpeg',
  type: ArtworkType.frontCover,
  dataLoader: () => loadLargeImageBytes(),
  enableStreaming: true,
  streamingThreshold: 5 * 1024 * 1024, // 5MB
);

// Process in chunks for large images
if (largeArtwork.shouldUseStreaming) {
  await for (final chunk in largeArtwork.streamData()) {
    processImageChunk(chunk);
  }
}

Memory Management Strategy

The class uses a tiered approach based on image size:

  1. Small images (< 100KB): Direct loading, no caching overhead
  2. Medium images (100KB - 5MB): Lazy loading with optional caching
  3. Large images (> 5MB): Streaming with minimal memory footprint

Performance Considerations

  • Cache lookups add minimal overhead for cache hits
  • Compression is only applied when beneficial (> 10% savings)
  • Streaming adds processing overhead but eliminates memory spikes
  • Size thresholds can be tuned based on application requirements
Implemented types

Constructors

OptimizedArtworkData({required String mimeType, required ArtworkType type, String? description, required Future<Uint8List> dataLoader(), ArtworkCache? cache, String? cacheKey, bool enableStreaming = true, int streamingThreshold = 5 * 1024 * 1024, int compressionThreshold = 512 * 1024, LazyArtworkLoader? lazyLoader})
Creates a new OptimizedArtworkData instance.
OptimizedArtworkData.fromArtworkData(ArtworkData artworkData, {ArtworkCache? cache, String? cacheKey, bool enableStreaming = true, int streamingThreshold = 5 * 1024 * 1024, int compressionThreshold = 512 * 1024})
Creates an OptimizedArtworkData from a standard ArtworkData.
factory
OptimizedArtworkData.fromLazyLoader(LazyArtworkLoader loader, {required String mimeType, required ArtworkType type, String? description, ArtworkCache? cache, String? cacheKey, bool enableStreaming = true, int streamingThreshold = 5 * 1024 * 1024, int compressionThreshold = 512 * 1024})
Creates an OptimizedArtworkData from a LazyArtworkLoader.
factory

Properties

data → Future<Uint8List>
Gets the actual image data using the optimal loading strategy.
no setteroverride
description → String?
Optional human-readable description of the artwork.
no setteroverride
estimatedSize → int?
Gets the estimated size of the artwork data in bytes.
no setter
fileExtension → String?
Returns the typical file extension for this artwork's MIME type.
no setteroverride
formatDescription → String
Returns a human-readable description of this artwork's format.
no setteroverride
hashCode → int
The hash code for this object.
no setterinherited
hasImmediateData → bool
Whether image data is available without async loading.
no setteroverride
immediateData → Uint8List?
Gets immediately available image data for synchronous operations.
no setteroverride
isLossy → bool
Returns true if this artwork's MIME type uses lossy compression.
no setteroverride
isVector → bool
Returns true if this artwork's MIME type is vector-based.
no setteroverride
mimeType → String
The MIME type of the artwork image.
no setteroverride
mimeTypeEnum → MimeType?
Returns the MimeType enum value for this artwork's MIME type.
no setteroverride
performanceMetrics → ArtworkPerformanceMetrics
Gets performance metrics for this artwork instance.
no setter
props → List<Object?>
The list of properties that will be used to determine whether two instances are equal.
no setter
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
shouldUseStreaming → bool
Determines if this artwork should use streaming based on its size.
no setter
stringify → bool?
If set to true, the toString method will be overridden to output this instance's props.
no setterinherited
supportsTransparency → bool
Returns true if this artwork's MIME type supports transparency.
no setteroverride
type → ArtworkType
The type/category of this artwork image.
no setteroverride

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
streamData({int chunkSize = 64 * 1024}) → Stream<Uint8List>?
Creates a stream for processing large artwork data in chunks.
streamDataWithProgress({int chunkSize = 64 * 1024}) → Stream<StreamingChunk>?
Creates a stream with progress information for large artwork.
toString() → String
A string representation of this object.

Operators

operator ==(Object other) → bool
The equality operator.
inherited