es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  ,

Answer

  1. Avatar for 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 de Futures y devuelve un Future que se completa cuando todos los Futures de la lista han terminado. Puedes usar esto para crear una lista de Futures que realicen el código de mapeo para un solo elemento en el Iterable 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[‘set
    name’] == element.setName,
    )) {
    // Realizar el código de mapeo aquí
    }
    });

    final filteredCards = await Future.wait(futures);
    “`

Comments are closed.