将大数据异步映射到Dart/Flutter中的列表中



我有一个用类似JSON的对象表示的大数据列表。它是从SQLite数据库中获取的Iterable<Map<String, dynamic>>

运行查询甚至过滤结果数据都是异步运行的,但当我试图将这些数据映射到一个类中时,主线程会冻结。

整个代码块在一个异步函数中,它返回未来的数据,但由于某种原因,toList只同步运行。

我试着用compute,但它一直在说

Invalid argument(s): Illegal argument in isolate message : (object is a closure - Function '<anonymous closure>':.)

我甚至试过RxDart的asyncMap,但效果似乎没有任何不同。

尝试避开function并使用正常的for也没有奏效。

如何使映射代码异步运行?

这正是出现问题的代码

final filteredCards = cardsRaw.where((e) {
return csvData.any(
(element) =>
e['card_name'] == element.cardName &&
(e['number'] as String).startsWith(element.cardNumber) &&
e['set_name'] == element.setName,
);
}).toList();

cardsRaw为11k,csvData为1000

Dart是单线程的,这意味着即使是异步调用,如果有昂贵的计算,也会冻结主线程。

正确的方法是像您尝试的那样使用compute生成隔离,但compute只能接受顶级(在类外声明的函数(或静态函数,这就是您出错的原因。

Flutter有一本方便的食谱,解释了如何在后台解析JSON:

您可以通过使用Flutter提供的compute((函数将解析和转换移动到后台隔离来删除jank。compute((函数在后台隔离中运行昂贵的函数并返回结果。

最新更新