Dya*_*ary 1 sorting list async-await dart flutter
我有这个代码:
widget.items.sort((a, b) {
await getItemDistance(a, true);
await getItemDistance(b, false);
return (itemADistance)
.compareTo(itemBDistance);
});
Run Code Online (Sandbox Code Playgroud)
我正在尝试根据从 getItemDistance 返回的值对 widget.items 列表进行排序。但是,我收到一条红色波浪线的错误消息,上面写着:
await 表达式只能在异步函数中使用
当我尝试将 async 添加到 sort 方法时,我得到另一条红色波浪线,上面写着:
不能将参数类型“Future Function(Item, Item)”分配给参数类型“int Function(Item, Item)”
我该如何解决这个困境伙计们?:) 谢谢
List.sort是一个需要同步回调的同步函数;没有办法将它与异步回调一起使用。我会建议改变你List,做任何必要的异步工作第一和再同步排序结果。这样做还应该避免getItemDistance多次调用(由于是异步的,可能很昂贵)同一个项目。例如,类似于:
final computedDistances = <Item, double>{};
for (final item in widget.items) {
final distance = await getItemDistance(item, ...);
computedDistances[item] = distance;
}
widget.items.sort((a, b) =>
computedDistances[a].compareTo(computedDistances[b])
);
Run Code Online (Sandbox Code Playgroud)
(我不知道第二个参数getItemDistance代表什么;如果你不能解决这个问题,你需要构建一个Map有getItemDistance(..., true)结果的和一个有getItemDistance(..., false)结果的。)
作为最后的手段,您可以编写自己的异步排序函数。
编辑
这应该是一个更高效的版本,因为它不会一一等待每个异步操作:
final computedDistances = await Future.wait<double>([
for (final item in widget.items) getItemDistance(item, ...),
]);
final computedDistancesMap = <Item, double>{
for (var i = 0; i < widget.items.length; i += 1)
widget.items[i]: computedDistances[i],
};
widget.items.sort((a, b) =>
computedDistancesMap[a].compareTo(computedDistancesMap[b])
);
Run Code Online (Sandbox Code Playgroud)