如何对从包含异步的函数返回的值使用 List.sort?

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)”

我该如何解决这个困境伙计们?:) 谢谢

jam*_*lin 6

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代表什么;如果你不能解决这个问题,你需要构建一个MapgetItemDistance(..., 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)