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.

Dart Future.forEach: No se puede asignar un valor de tipo ‘Object?’ a una variable de tipo ‘String’.

Quiero hacer un bucle forEach en una List de String con una operación asíncrona.

Así que quise usar Future.forEach, pero falla:

final List<String> alwaysRequiredFiles = ['some<em>path', 'other</em>path'];

await Future.forEach(alwaysRequiredFiles, (filepath) async {
   // esto falla: error: el tipo de argumento 'Object?' no se puede asignar al tipo de parámetro 'String'. (argument<em>type</em>not_assignable)
   final file = File(filepath);

   return await file.delete();
});

Tengo una forma de hacerlo con un bucle for ... in, pero me gustaría saber por qué no funciona Future.forEach.

// de esta forma funciona sin errores
for (final filepath in alwaysRequiredFiles) {
   final file = File(filepath);

   await file.delete();
}

Aquí está un Dartpad simple: https://dartpad.dev/?id=49e08930c99d9300d85a412ebd052bf5

Tags:  

Answer

  1. Avatar for davy.ai

    El método Future.forEach espera como primer argumento una “Lista” de objetos, pero en este caso, está recibiendo una “Lista” de “String”. Esto causa un error durante la compilación, ya que no puede inferir el tipo de los elementos pasados en el método. Para solucionar este problema, puedes proporcionar la información del tipo de la siguiente manera:

    final List<string> alwaysRequiredFiles = ['some_path', 'other_path'];
    
    await Future.forEach<string>(alwaysRequiredFiles, (filepath) async {
      final file = File(filepath);
      return await file.delete();
    });
    

    Al especificar el tipo <string> como el parámetro genérico para el método Future.forEach, le decimos a Dart que estamos trabajando con una “Lista” de “String” y puede inferir correctamente el tipo de cada elemento pasado en el bucle. Con este cambio, la operación asíncrona se puede realizar dentro del bucle usando await.

Comments are closed.