假设我的目标是显示一个;无尽的";向用户推荐的项目列表。
为此,我实现了一些异步方法getItemsFromServer(…(,它非常昂贵(就服务器使用、时间、电池等而言(,可以从服务器获取100个新项目(及其图像(,并通过添加从服务器获取的项目来更新推荐项目屏幕的状态。
我的目标是,只有当用户还没有查看的项目少于20个时,才调用此函数。问题是,如果我对它进行天真的编程,例如
if(itemsNotViewed<20){
getItemsFromServer(...)
}
在用户点击或查看了一些新项目后,这个异步方法将被调用大约20次。。。在不干扰用户体验的情况下,只调用一次方法并等待其完成,最有原则的方法是什么?
future对象本身对于记住是否发生了什么非常有用。理想情况下,您可以将其放入从多个位置调用的函数中。
class MyState ... {
Future itemsBeingGotten;
build() {
...
onPress: () async {
if (itemsBeingGotten == null && itemsNotViewed < 20) {
try {
itemsBeingGotten = getItemsFromServer()
await itemsBeingGotten;
} finally {
itemsBeingGotten = null;
}
}
}
}