Solución:
No es necesario devolver nada manualmente, ya que un async
La función solo regresará cuando la función esté realmente hecha.
Al mirar sus ejemplos, se está perdiendo el async
palabra clave, lo que significa que debe escribir lo siguiente en su lugar:
Future<void> deleteAll(List stuff) async {
stuff.forEach( s => delete(s));
}
Future<void> delete(Stuff s) async {
....
await file.writeAsString(jsonEncode(...));
}
No es necesario devolver nada, ya que void
no es nada, como su nombre lo indica.
También asegúrate de llamar deleteAll
y writeAsString()
utilizando await
.
No puedes hacer eso con forEach
.
Pero puedes usar Future.wait
y .map
como esto
Future<void> deleteAll(List stuff) {
return Future.wait(stuff.map((s) => delete(s)));
}
Future<void> delete(Stuff s) async{
....
await file.writeAsString(jsonEncode(...));
}
Cuándo usar async
palabra clave:
Puedes usar async
cuando tu función usa await
palabra clave dentro.
Entonces, cuando usar await
palabra clave:
- cuando desea obtener el resultado de una función asincrónica y desea hacer algo de lógica en el resultado
Future<int> fetchCountAndValidate() asycn{
final result = await fetchCountFromServer();
if(result == null)
return 0;
else
return result;
}
- Cuando desee llamar a varias funciones asincrónicas
Future<int> fetchTotalCount() asycn{
final result1 = await fetchCount1FromServer();
final result2 = await fetchCount2FromServer();
return result1 + result2;
}
Cuando no necesitas async
o await
:
- Cuando acaba de llamar a otra función asincrónica
Future<int> getCount(){
//some synchronous logic
final requestBody = {
"countFor": "..."
};
return fetchCountFromServer(requestBody); //this is an asynchronous function which returns `Future<int>`
}
- En algunos casos raros, no nos importa la finalización de la función asincrónica
void sendLogoutSignal(){
http.post(url, {"username" : "id0001"});
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)