Mapeo de datos grandes en lista en Dart/Flutter de forma asíncrona.
Tengo una gran lista de datos representados en un objeto similar a JSON. Es un Iterable<><string, dynamic=””>> adquirido de una base de datos SQLite.
Ejecutar la consulta e incluso filtrar los datos resultantes se ejecuta de manera asíncrona, pero cuando intento mapear estos datos en una clase, el hilo principal se congela.
Todo el bloque de código está en una función asíncrona, y devuelve un futuro de datos, pero por alguna razón, toList se ejecuta solo sincrónicamente.
Intenté usar compute, pero sigue diciendo
Argumentos no válidos: Argumento ilegal en el mensaje del aislado: (el objeto es un cierre – Función ‘<anónima closure=””>:.’)
Incluso intenté asyncMap de RxDart, pero eso no pareció funcionar de manera diferente.
Intentar evitar la función y usar un for normal tampoco funcionó.
¿Qué puedo hacer para que el código de mapeo se ejecute de manera asíncrona?
Este es el código exacto que tiene el problema:
dart
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 es 11k, y csvData es 1000.</anónima></string,>
davy.ai
Una posible solución es utilizar el método
Future.wait
para ejecutar el código de mapeo de forma asíncrona.Future.wait
toma una lista deFuture
s y devuelve unFuture
que se completa cuando todos losFuture
s de la lista han terminado. Puedes usar esto para crear una lista deFuture
s que realicen el código de mapeo para un solo elemento en elIterable
y luego esperar a que todos ellos terminen.“`dart
final futures = cardsRaw.map((e) async {
if (csvData.any(
(element) =>
e[‘cardname’] == element.cardName &&
(e[‘number’] as String).startsWith(element.cardNumber) &&
e[‘setname’] == element.setName,
)) {
// Realizar el código de mapeo aquí
}
});
final filteredCards = await Future.wait(futures);
“`