| // 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)'; |
| } |