我将JavaScript背景图片加载器转换为Dart,有点像:Javascript image loader
我使用Timer来检查图像是否全部加载。 这很好用。
但在Dart有可连接的期货,我想知道你是否可以连锁 ImageElements的后台加载......
ImageElement a = new ImageElement();
ImageElement b = new ImageElement();
ImageElement c = new ImageElement();
Future.wait([a.src='a.jpg', b.src='b.jpg', c.src='ca.jpg'])
.then((List responses) => chooseBestResponse(responses))
.catchError((e) => handleError(e));
当然,分配src和实际的图像加载是异步的,所以这不起作用......
一旦加载,我还需要为每个图像执行一些代码。
也许我需要编写自己的FutureImageElement类,但我想我先问...
有什么想法吗?
答案 0 :(得分:24)
当然,你可以使用期货。只需使用streams的first
属性:
var a = new ImageElement(src: 'a.png');
var b = new ImageElement(src: 'b.png');
var c = new ImageElement(src: 'c.png');
var futures = [a.onLoad.first, b.onLoad.first, c.onLoad.first];
Future.wait(futures).then((_) => print('done'));
加载所有三张图像后,将打印文本“完成”。
答案 1 :(得分:0)
你真的需要和Futures合作吗?
为什么不能这样:
List<String> files = ["a", "b", "c"];
int imagesToLoad = files.length;
for (String fileName in files) {
ImageElement pic = new ImageElement()
..src = "$fileName.jpg"
..onLoad.listen((Event e) {
// do something when the file has finished loading
imagesToLoad--;
if (imagesToLoad == 0) {
// do something when all images have loaded
}
})
;
}