gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:10:09 25 4
gpt4 key购买 nike

我有这个代码:

 widget.items.sort((a, b) {

await getItemDistance(a, true);
await getItemDistance(b, false);

return (itemADistance)
.compareTo(itemBDistance);
});

我正在尝试根据 getItemDistance 返回的值对 widget.items 列表进行排序。但是我收到一条红色波浪线的错误,上面写着:

The await expression can only be used in an async function

当我尝试将异步添加到排序方法时,我得到另一条红色波浪线,上面写着:

The argument type 'Future Function(Item, Item)' can't be assigned to the parameter type '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])
);

(我不知道 getItemDistance 的第二个参数代表什么;如果您无法解决这个问题,则需要使用 构建一个 Map >getItemDistance(..., true) 结果和 getItemDistance(..., false) 结果1。)

作为最后的手段,您可以编写自己的异步排序函数。


编辑#1

这应该是一个更高效的版本,因为它不会逐一等待每个异步操作:

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])
);

编辑#2

我添加了 List.sortWithAsyncKey extension methodpackage:dartbag可以做到这一点:

await widget.items.sortWithAsyncKey(
(element) => getItemDistance(element, ...),
);

1 但是,如果您需要为第一个参数调用 getItemDistance(..., true)getItemDistance(..., false) 对于第二个参数,这意味着 your comparison function probably is not self-consistent .

关于list - 如何对包含异步的函数返回的值使用 List.sort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com