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.

Flutter – ¿Cómo esperar dentro de un FutureBuilder?

 return FutureBuilder<QuerySnapshot>(
  future: exercisesRef.get(),
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (snapshot.hasError) {
      return Text("Algo salió mal");
    }
... más código

//ESTO DEBE ESPERARSE...
 _generateDataTableRowsForCompletedExercises(
                weight,
                reps,
                isToFailure,
              );

Es una función void:

    void _generateDataTableRowsForCompletedExercises(weight, reps, isToFailure) {

  dataRowsForCompletedExercises.add(
      DataRow(cells: [
      DataCell(Text('')),
      DataCell(Text(weight)),
      DataCell(Text(reps)),
      DataCell((isToFailure == true) ? Icon(Icons.check) : Icon(null)),

    ]),
  );

}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarnos de que _generateDataTableRowsForCompletedExercises esté esperando, necesitamos que sea una función asíncrona y esperar al Future en el que está esperando.

    Una solución podría ser hacer que _generateDataTableRowsForCompletedExercises devuelva un Future que se resuelva una vez que se agregue la DataRow a dataRowsForCompletedExercises. Luego, podemos esperar esta función dentro del método builder de FutureBuilder antes de devolver el widget. Aquí tienes un ejemplo de implementación:

    Future<void> _generateDataRowForCompletedExercises(peso, repeticiones, llegaAlFallo) async {
      await Future.delayed(Duration.zero); // Agrega una pequeña demora para dar tiempo a que se resuelva el snapshot
      dataRowsForCompletedExercises.add(
        DataRow(cells: [
          DataCell(Text('')),
          DataCell(Text(peso)),
          DataCell(Text(repeticiones)),
          DataCell((llegaAlFallo == true) ? Icon(Icons.check) : Icon(null)),
        ]),
      );
    }
    
    Widget build(BuildContext context) {
      return FutureBuilder<querysnapshot>(
        future: exercisesRef.get(),
        builder: (BuildContext context, AsyncSnapshot<querysnapshot> snapshot) {
          if (snapshot.hasError) {
            return Text("Algo salió mal");
          }
    
          // Espera la llamada a la función _generateDataRowForCompletedExercises
          await _generateDataRowForCompletedExercises(peso, repeticiones, llegaAlFallo);
    
          // Devuelve el resto del widget
          ...
        },
      );
    }
    

    Nota: Si necesitas llamar a _generateDataRowForCompletedExercises varias veces, es posible que quieras usar un Completer para asegurarte de que la llamada a la función se resuelva completamente antes de pasar a la siguiente.

Comments are closed.