import 'package:aves/model/image_file_service.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:pedantic/pedantic.dart'; class UriPicture extends PictureProvider { const UriPicture(this.uri, {this.colorFilter}) : assert(uri != null); final String uri; /// The [ColorFilter], if any, to use when drawing this picture. final ColorFilter colorFilter; @override Future obtainKey(PictureConfiguration configuration) { return SynchronousFuture(this); } @override PictureStreamCompleter load(UriPicture key, {PictureErrorListener onError}) { return OneFramePictureStreamCompleter(_loadAsync(key, onError: onError), informationCollector: () sync* { yield DiagnosticsProperty('Uri', uri); }); } Future _loadAsync(UriPicture key, {PictureErrorListener onError}) async { assert(key == this); final data = await ImageFileService.readAsBytes(uri); if (data == null || data.isEmpty) { return null; } final decoder = SvgPicture.svgByteDecoder; if (onError != null) { final future = decoder(data, colorFilter, key.toString()); unawaited(future.catchError(onError)); return future; } return decoder(data, colorFilter, key.toString()); } @override bool operator ==(Object other) { if (other.runtimeType != runtimeType) return false; return other is UriPicture && other.uri == uri && other.colorFilter == colorFilter; } @override int get hashCode => hashValues(uri, colorFilter); @override String toString() => '${objectRuntimeType(this, 'UriPicture')}("$uri", colorFilter: $colorFilter)'; }