我有一个用类似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((函数在后台隔离中运行昂贵的函数并返回结果。