9

我将 JavaScript 背景图像加载器转换为 Dart,有点像这样:Javascript image loader

我使用计时器来检查图像是否已全部加载。这工作正常。

但是在 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 类,但我想我会先问...

有任何想法吗 ?

4

2 回答 2

24

当然,您可以使用期货。只需使用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'));

加载所有三个图像后,将打印文本“完成”。

于 2013-04-15T12:16:31.757 回答
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
          }
        })
    ;
}
于 2013-04-15T01:27:48.723 回答