mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Convert image_cache to using Futures rather than callbacks
Future<sky.Image> is easier to work with than a callback that provides an image. It will also let us use other images sources that vend futures to images. R=jackson@google.com Review URL: https://codereview.chromium.org/1216303005.
This commit is contained in:
parent
f3410b4f51
commit
839cc4cc72
@ -18,7 +18,7 @@ class ImageMap {
|
||||
}
|
||||
|
||||
void _addURL(String url) {
|
||||
image_cache.load(url, (Image image) {
|
||||
image_cache.load(url).then((Image image) {
|
||||
// Store reference to image
|
||||
_images[url] = image;
|
||||
|
||||
@ -34,4 +34,4 @@ class ImageMap {
|
||||
Image getImage(String url) => _images[url];
|
||||
|
||||
Image operator [](String url) => _images[url];
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,7 +59,7 @@ bool handleEvent(Event event) {
|
||||
}
|
||||
|
||||
if (event.type == "pointerup") {
|
||||
image_cache.load(url2, handleImageLoad);
|
||||
image_cache.load(url2).then(handleImageLoad);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -67,8 +67,7 @@ bool handleEvent(Event event) {
|
||||
}
|
||||
|
||||
void main() {
|
||||
image_cache.load(url1, handleImageLoad);
|
||||
image_cache.load(url1, handleImageLoad);
|
||||
image_cache.load(url1).then(handleImageLoad);
|
||||
view.setEventCallback(handleEvent);
|
||||
view.setBeginFrameCallback(beginFrame);
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@ import 'shell.dart' as shell;
|
||||
import 'net/fetch.dart';
|
||||
|
||||
Future<sky.Image> _decodeImage(core.MojoDataPipeConsumer assetData) {
|
||||
Completer<sky.Image> completer = new Completer();
|
||||
Completer<sky.Image> completer = new Completer<sky.Image>();
|
||||
new sky.ImageDecoder(assetData.handle.h, completer.complete);
|
||||
return completer.future;
|
||||
}
|
||||
|
||||
@ -2,27 +2,28 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:sky';
|
||||
import 'dart:async';
|
||||
import 'dart:sky' as sky;
|
||||
import 'dart:collection';
|
||||
|
||||
import 'package:mojom/mojo/url_response.mojom.dart';
|
||||
|
||||
import 'fetch.dart';
|
||||
|
||||
final HashMap<String, List<ImageDecoderCallback>> _pendingRequests =
|
||||
new HashMap<String, List<ImageDecoderCallback>>();
|
||||
final HashMap<String, List<sky.ImageDecoderCallback>> _pendingRequests =
|
||||
new HashMap<String, List<sky.ImageDecoderCallback>>();
|
||||
|
||||
final HashMap<String, Image> _completedRequests =
|
||||
new HashMap<String, Image>();
|
||||
final HashMap<String, sky.Image> _completedRequests =
|
||||
new HashMap<String, sky.Image>();
|
||||
|
||||
void _loadComplete(url, image) {
|
||||
void _loadComplete(String url, sky.Image image) {
|
||||
_completedRequests[url] = image;
|
||||
_pendingRequests[url].forEach((c) => c(image));
|
||||
_pendingRequests.remove(url);
|
||||
}
|
||||
|
||||
void load(String url, ImageDecoderCallback callback) {
|
||||
Image result = _completedRequests[url];
|
||||
void _load(String url, sky.ImageDecoderCallback callback) {
|
||||
sky.Image result = _completedRequests[url];
|
||||
if (result != null) {
|
||||
callback(_completedRequests[url]);
|
||||
return;
|
||||
@ -31,7 +32,7 @@ void load(String url, ImageDecoderCallback callback) {
|
||||
bool newRequest = false;
|
||||
_pendingRequests.putIfAbsent(url, () {
|
||||
newRequest = true;
|
||||
return new List<ImageDecoderCallback>();
|
||||
return new List<sky.ImageDecoderCallback>();
|
||||
}).add(callback);
|
||||
if (newRequest) {
|
||||
fetchUrl(url).then((UrlResponse response) {
|
||||
@ -39,8 +40,15 @@ void load(String url, ImageDecoderCallback callback) {
|
||||
_loadComplete(url, null);
|
||||
return;
|
||||
}
|
||||
new ImageDecoder(response.body.handle.h,
|
||||
(image) => _loadComplete(url, image));
|
||||
new sky.ImageDecoder(response.body.handle.h, (image) {
|
||||
_loadComplete(url, image);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<sky.Image> load(String url) {
|
||||
Completer<sky.Image> completer = new Completer<sky.Image>();
|
||||
_load(url, completer.complete);
|
||||
return completer.future;
|
||||
}
|
||||
|
||||
@ -140,7 +140,7 @@ class BackgroundImage {
|
||||
this.fit: BackgroundFit.scaleDown,
|
||||
this.repeat: BackgroundRepeat.noRepeat
|
||||
}) {
|
||||
image_cache.load(src, (image) {
|
||||
image_cache.load(src).then((image) {
|
||||
if (image == null)
|
||||
return;
|
||||
_image = image;
|
||||
|
||||
@ -904,7 +904,7 @@ class RenderImage extends RenderBox {
|
||||
if (value == _src)
|
||||
return;
|
||||
_src = value;
|
||||
image_cache.load(_src, (result) {
|
||||
image_cache.load(_src).then((result) {
|
||||
_image = result;
|
||||
if (requestedSize.width == null || requestedSize.height == null)
|
||||
markNeedsLayout();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user