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
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:Al especificar el tipo
<string>
como el parámetro genérico para el métodoFuture.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 usandoawait
.