我有一個用類似 JSON 的物件表示的大資料串列。它是Iterable<Map<String, dynamic>>從 SQLite 資料庫中獲取的。
運行查詢甚至過濾結果資料異步運行,但是當我嘗試將此資料映射到類時,主執行緒凍結。
整個代碼塊在一個異步函式中,它回傳資料的未來,但由于某種原因,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
uj5u.com熱心網友回復:
Dart 是單執行緒的,這意味著如果主執行緒的計算開銷很大,即使是異步呼叫也會凍結主執行緒。
正確的做法是使用compute您嘗試過的方法生成一個隔離,但compute只能采用頂級(在類之外宣告的函式)或靜態函式,這就是您出錯的原因。
Flutter 有一本方便的食譜,解釋了如何在后臺決議 JSON:
您可以使用 Flutter 提供的計算()函式通過將決議和轉換移動到后臺隔離來消除卡頓。compute() 函式在后臺隔離中運行昂貴的函式并回傳結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/360807.html
上一篇:錯誤:無法在需要const運算式的地方呼叫非“const”建構式。嘗試使用“const”的建構式或工廠。容器(
下一篇:Flutterflutter_webview_plugin錯誤[NSNull長度]:無法識別的選擇器發送到ios上的實體
