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.

Future Builder no está construyendo.

Estoy tratando de iniciar sesión de un usuario con el valor booleano asignado al campo ‘isVerified’ en el documento de firestore del usuario.

En otras palabras, si ‘isVerified’ es verdadero, continúa, de lo contrario regresa a la página de verificación.

He agregado instrucciones debugPrint para ayudarme a detectar el error y parece que el Future Builder no está pasando del contexto del constructor. He leído otra documentación con respecto a los future builders, pero no encuentro dónde está mi error. Por favor, avísame si hay algo que pueda aclarar. Gracias.

Utilizando Future Builder para asincronía

FutureBuilder(
    future: getVerified(),
    builder: (context, snapshot) { 
        debugPrint('>>> Home: FutureBuilder: checkpoint'); // no se imprime en la consola
        if (snapshot.hasData && !snapshot.hasError) {
            debugPrint('>>> Home: FutureBuilder: Snapshot has data and no error');
        }
        return const Text('');
    }
);

Future

dart
Future<bool> getVerified() async {
debugPrint('>>> Home: getVerified Started');
User? user = auth.currentUser;
await FirebaseFirestore.instance
.collection('users')
.doc(user!.uid)
.get()
.then((value) {
bool isVerified = value.data()['isVerified'];
debugPrint('>>> Home: getVerified $isVerified'); // esta variable actualmente es verdadera o falsa
return isVerified; // esto devolverá una instancia de '_Future'
});
return false;
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema podría estar en la forma en que estás manejando el valor de retorno de la función getVerified(). En la función getVerified(), estás retornando false independientemente del valor de isVerified, y no estás retornando el valor real de isVerified.

    Para solucionar esto, debes retornar el valor real de isVerified desde la función getVerified() en lugar de retornar false incondicionalmente. Aquí está el código corregido:

    Future<bool> getVerified() async {
      debugPrint('>>> Home: getVerified Started');
      User? user = auth.currentUser;
      DocumentSnapshot snapshot = await FirebaseFirestore.instance
        .collection('users')
        .doc(user!.uid)
        .get();
      bool isVerified = snapshot.data()!['isVerified'];
      debugPrint('>>> Home: getVerified $isVerified');
      return isVerified;
    }
    

    Observa que estoy usando await para esperar el resultado del método get(), y luego almacenando el resultado en una variable snapshot. Luego extraigo el valor de isVerified de snapshot y lo retorno desde la función.

    Ahora, en el widget FutureBuilder, puedes usar este Future<bool> para determinar si continuar o volver a la página de verificación. Aquí está el código actualizado para FutureBuilder:

    FutureBuilder(
      future: getVerified(),
      builder: (context, snapshot) {
        debugPrint('>>> Home: FutureBuilder: checkpoint');
        if (snapshot.hasData && !snapshot.hasError) {
          bool isVerified = snapshot.data!;
          if (isVerified) {
            debugPrint('>>> Home: FutureBuilder: Snapshot has data and no error');
            return Text('Usuario está verificado');
          } else {
            debugPrint('>>> Home: Usuario no está verificado');
            // navegar a la página de verificación
            return Text('Usuario no está verificado');
          }
        } else {
          debugPrint('>>> Home: FutureBuilder: Snapshot has no data or has error');
          return CircularProgressIndicator();
        }
      },
    );
    

    Aquí, estoy verificando el valor de snapshot.hasData y snapshot.hasError para asegurarme de que el FutureBuilder esté obteniendo los datos esperados. Si hasData es true y isVerified es true, retorno el texto Usuario está verificado. De lo contrario, retorno el texto Usuario no está verificado y navego a la página de verificación. Si hasData es false o hasError es true, retorno un widget CircularProgressIndicator para indicar que los datos aún se están cargando.

Comments are closed.