// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'dart:ui' as ui; import 'package:flutter/foundation.dart'; import 'image_provider.dart' as image_provider; import 'image_stream.dart'; /// The dart:html implementation of [image_provider.NetworkImage]. /// /// NetworkImage on the web does not support decoding to a specified size. class NetworkImage extends image_provider.ImageProvider<image_provider.NetworkImage> implements image_provider.NetworkImage { /// Creates an object that fetches the image at the given URL. /// /// The arguments [url] and [scale] must not be null. const NetworkImage(this.url, {this.scale = 1.0, this.headers}) : assert(url != null), assert(scale != null); @override final String url; @override final double scale; @override final Map<String, String> headers; @override Future<NetworkImage> obtainKey(image_provider.ImageConfiguration configuration) { return SynchronousFuture<NetworkImage>(this); } @override ImageStreamCompleter load(image_provider.NetworkImage key, image_provider.DecoderCallback decode) { return MultiFrameImageStreamCompleter( codec: _loadAsync(key as NetworkImage, decode), scale: key.scale, informationCollector: () { return <DiagnosticsNode>[ DiagnosticsProperty<image_provider.ImageProvider>('Image provider', this), DiagnosticsProperty<NetworkImage>('Image key', key as NetworkImage), ]; }, ); } // TODO(garyq): We should eventually support custom decoding of network images on Web as // well, see https://github.com/flutter/flutter/issues/42789. // // Web does not support decoding network images to a specified size. The decode parameter // here is ignored and the web-only `ui.webOnlyInstantiateImageCodecFromUrl` will be used // directly in place of the typical `instantiateImageCodec` method. Future<ui.Codec> _loadAsync(NetworkImage key, image_provider.DecoderCallback decode) { assert(key == this); final Uri resolved = Uri.base.resolve(key.url); // This API only exists in the web engine implementation and is not // contained in the analyzer summary for Flutter. return ui.webOnlyInstantiateImageCodecFromUrl(resolved) as Future<ui.Codec>; // ignore: undefined_function } @override bool operator ==(Object other) { if (other.runtimeType != runtimeType) { return false; } return other is NetworkImage && other.url == url && other.scale == scale; } @override int get hashCode => ui.hashValues(url, scale); @override String toString() => '${objectRuntimeType(this, 'NetworkImage')}("$url", scale: $scale)'; }