gpt4 book ai didi

flutter - 使用隔离对列表进行排序

转载 作者:行者123 更新时间:2023-12-03 03:16:06 24 4
gpt4 key购买 nike

我有一个非原始列表,我想对其进行排序。

对它进行排序时,UI线程被阻止,应用程序冻结了几秒钟。

我试图通过使用dart的Isloate compute函数来避免这种情况,但是由于发送到计算函数的参数必须是基元或基元的列表/映射(send method),因此它不起作用。

总之,有什么方法可以执行列表排序(非原始)而不阻塞UI线程?

编辑:澄清-我试图通过计算调用函数,并且我传递了一个对象列表(我从第三方插件获得)作为参数,这些对象具有Iterable类型的属性,导致所有操作失败-确保所有类型都是基本类型或基本类型的列表/映射。收到答案后,将类型从Iterable更改为List起作用了。

最佳答案

我不确定我是否理解您的问题,但是您可以像这样对非原始元素进行排序:

final List<Element> elements = [
Element(id: 1),
Element(id: 7),
Element(id: 2),
Element(id: 0)
];

elements.sort((a, b) => a.compareTo(b));
// or
elements.sort((a, b) => a.id > b.id ? 1 : -1);

这将是 print(elements);输出:
I/flutter ( 7351): [id: 0, id: 1, id: 2, id: 7]

这将是 Element
class Element {
final int id;

Element({this.id});

@override
String toString() => "id: $id";

int compareTo(Element other) => this.id > other.id ? 1 : -1;
}

编辑:要异步进行此操作,可以执行以下操作:
Future<List<Element>> asyncSort() async {
print("before sort: $elements");
elements = await compute(_sort, elements);
print("after sort: $elements");
return elements;
}

static List<Element> _sort(List<Element> list) {
list.sort((a, b) => a.compareTo(b));
return list;
}

print("before calling asyncSort(): $elements");
asyncSort();
print("after calling asyncSort(): $elements");

这将是输出:
I/flutter ( 7351): before calling asyncSort(): [id: 1, id: 7, id: 2, id: 0]
I/flutter ( 7351): before sort: [id: 1, id: 7, id: 2, id: 0]
I/flutter ( 7351): after calling asyncSort(): [id: 1, id: 7, id: 2, id: 0]
I/flutter ( 7351): after sort: [id: 0, id: 1, id: 2, id: 7]

Edit2:如果要将比较函数发送给 compute,则可以将 MapList参数与列表和compare函数一起使用,并传递该参数而不是列表,因为 compute仅接受一个参数。这是一个例子:
Future<List<Element>> asyncSort() async {
print("before sort: $elements");
Map args = {"list": elements, "compare": compare};
elements = await compute(_sortWith, args);
print("after sort: $elements");
return elements;
}

static List<Element> _sortWith(Map args) {
List<Element> list = args["list"];
Function(Element a, Element b) compare = args["compare"];

list.sort((a, b) => compare(a, b));
return list;
}

static int compare(Element a, Element b) {
return a.id > b.id ? 1 : -1;
}

关于flutter - 使用隔离对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58397840/

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