【发布时间】:2019-01-03 23:55:54
【问题描述】:
如果图像已经加载,我希望能够在单个微任务中访问网络图像。但是,使用 NetworkImage 和 FutureBuilder 中可用的当前 API,这似乎是不可能的。
这就是我们通常将两者连接起来的方式:
NetworkImage imageProvider = getSomeNetworkImage(id);
Completer<ui.Image> completer = Completer<ui.Image>();
imageProvider.resolve(ImageConfiguration()).addListener(
(ImageInfo info, _) => completer.complete(info.image));
return FutureBuilder<ui.Image>(
future: completer.future,
builder: (BuildContext futureBuilderContext, AsyncSnapshot<ui.Image> snapshot) {
if (!snapshot.hasData) {
return _buildPlaceholder();
} else {
return _buildActual(context, snapshot.data, imageProvider);
}
},
);
addListener() 如果图像已经存在,则立即调用 completer.complete()。然而,FutureBuilder 是基于 completer.future 的,直到下一个微任务才会完成。因此,即使图像可用,也会暂时显示占位符。
避免这种情况的最佳方法是什么?或许,imageProvider 应该暴露一个 Future 来阻止我们通过一个完成器来传递它?
【问题讨论】:
标签: flutter