Merge pull request #1507 from abarth/image_decoding
NetworkImage occasionally does not grab the image
This commit is contained in:
commit
66c6ce3794
@ -16,6 +16,7 @@ export 'src/services/asset_bundle.dart';
|
|||||||
export 'src/services/embedder.dart';
|
export 'src/services/embedder.dart';
|
||||||
export 'src/services/fetch.dart';
|
export 'src/services/fetch.dart';
|
||||||
export 'src/services/image_cache.dart';
|
export 'src/services/image_cache.dart';
|
||||||
|
export 'src/services/image_decoder.dart';
|
||||||
export 'src/services/image_resource.dart';
|
export 'src/services/image_resource.dart';
|
||||||
export 'src/services/keyboard.dart';
|
export 'src/services/keyboard.dart';
|
||||||
export 'src/services/shell.dart';
|
export 'src/services/shell.dart';
|
||||||
|
@ -11,6 +11,7 @@ import 'package:mojo/core.dart' as core;
|
|||||||
import 'package:mojo_services/mojo/asset_bundle/asset_bundle.mojom.dart';
|
import 'package:mojo_services/mojo/asset_bundle/asset_bundle.mojom.dart';
|
||||||
import 'package:sky/src/services/fetch.dart';
|
import 'package:sky/src/services/fetch.dart';
|
||||||
import 'package:sky/src/services/image_cache.dart';
|
import 'package:sky/src/services/image_cache.dart';
|
||||||
|
import 'package:sky/src/services/image_decoder.dart';
|
||||||
import 'package:sky/src/services/image_resource.dart';
|
import 'package:sky/src/services/image_resource.dart';
|
||||||
import 'package:sky/src/services/shell.dart';
|
import 'package:sky/src/services/shell.dart';
|
||||||
|
|
||||||
@ -66,13 +67,13 @@ class MojoAssetBundle extends AssetBundle {
|
|||||||
_imageCache = null;
|
_imageCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<sky.Image> _fetchImage(String key) async {
|
||||||
|
return await decodeImageFromDataPipe(await load(key));
|
||||||
|
}
|
||||||
|
|
||||||
ImageResource loadImage(String key) {
|
ImageResource loadImage(String key) {
|
||||||
return _imageCache.putIfAbsent(key, () {
|
return _imageCache.putIfAbsent(key, () {
|
||||||
Completer<sky.Image> completer = new Completer<sky.Image>();
|
return new ImageResource(_fetchImage(key));
|
||||||
load(key).then((assetData) {
|
|
||||||
new sky.ImageDecoder.consume(assetData.handle.h, completer.complete);
|
|
||||||
});
|
|
||||||
return new ImageResource(completer.future);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,8 +7,18 @@ import 'dart:collection';
|
|||||||
import 'dart:sky' as sky;
|
import 'dart:sky' as sky;
|
||||||
|
|
||||||
import 'package:mojo/mojo/url_response.mojom.dart';
|
import 'package:mojo/mojo/url_response.mojom.dart';
|
||||||
import 'package:sky/src/services/image_resource.dart';
|
|
||||||
import 'package:sky/src/services/fetch.dart';
|
import 'package:sky/src/services/fetch.dart';
|
||||||
|
import 'package:sky/src/services/image_decoder.dart';
|
||||||
|
import 'package:sky/src/services/image_resource.dart';
|
||||||
|
|
||||||
|
Future<sky.Image> _fetchImage(String url) async {
|
||||||
|
UrlResponse response = await fetchUrl(url);
|
||||||
|
if (response.statusCode >= 400) {
|
||||||
|
print("Failed (${response.statusCode}) to load image ${url}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return await decodeImageFromDataPipe(response.body);
|
||||||
|
}
|
||||||
|
|
||||||
class _ImageCache {
|
class _ImageCache {
|
||||||
_ImageCache._();
|
_ImageCache._();
|
||||||
@ -17,16 +27,7 @@ class _ImageCache {
|
|||||||
|
|
||||||
ImageResource load(String url) {
|
ImageResource load(String url) {
|
||||||
return _cache.putIfAbsent(url, () {
|
return _cache.putIfAbsent(url, () {
|
||||||
Completer<sky.Image> completer = new Completer<sky.Image>();
|
return new ImageResource(_fetchImage(url));
|
||||||
fetchUrl(url).then((UrlResponse response) {
|
|
||||||
if (response.statusCode >= 400) {
|
|
||||||
print("Failed (${response.statusCode}) to load image ${url}");
|
|
||||||
completer.complete(null);
|
|
||||||
} else {
|
|
||||||
new sky.ImageDecoder.consume(response.body.handle.h, completer.complete);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return new ImageResource(completer.future);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
packages/flutter/lib/src/services/image_decoder.dart
Normal file
32
packages/flutter/lib/src/services/image_decoder.dart
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright 2015 The Chromium 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:sky' show Image, ImageDecoder, ImageDecoderCallback;
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:mojo/core.dart' show MojoDataPipeConsumer;
|
||||||
|
|
||||||
|
final Set<ImageDecoder> _activeDecoders = new Set<ImageDecoder>();
|
||||||
|
|
||||||
|
typedef ImageDecoder _DecoderFactory(ImageDecoderCallback callback);
|
||||||
|
|
||||||
|
Future<Image> _decode(_DecoderFactory createDecoder) {
|
||||||
|
Completer<Image> completer = new Completer<Image>();
|
||||||
|
ImageDecoder decoder;
|
||||||
|
decoder = createDecoder((Image image) {
|
||||||
|
_activeDecoders.remove(decoder);
|
||||||
|
completer.complete(image);
|
||||||
|
});
|
||||||
|
_activeDecoders.add(decoder);
|
||||||
|
return completer.future;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Image> decodeImageFromDataPipe(MojoDataPipeConsumer consumerHandle) {
|
||||||
|
return _decode((ImageDecoderCallback callback) => new ImageDecoder.consume(consumerHandle.handle.h, callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Image> decodeImageFromList(Uint8List list) {
|
||||||
|
return _decode((ImageDecoderCallback callback) => new ImageDecoder.fromList(list, callback));
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user