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;
}
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óngetVerified()
, estás retornandofalse
independientemente del valor deisVerified
, y no estás retornando el valor real deisVerified
.Para solucionar esto, debes retornar el valor real de
isVerified
desde la funcióngetVerified()
en lugar de retornarfalse
incondicionalmente. Aquí está el código corregido:Observa que estoy usando
await
para esperar el resultado del métodoget()
, y luego almacenando el resultado en una variablesnapshot
. Luego extraigo el valor deisVerified
desnapshot
y lo retorno desde la función.Ahora, en el widget
FutureBuilder
, puedes usar esteFuture<bool>
para determinar si continuar o volver a la página de verificación. Aquí está el código actualizado paraFutureBuilder
:Aquí, estoy verificando el valor de
snapshot.hasData
ysnapshot.hasError
para asegurarme de que elFutureBuilder
esté obteniendo los datos esperados. SihasData
estrue
yisVerified
estrue
, retorno el textoUsuario está verificado
. De lo contrario, retorno el textoUsuario no está verificado
y navego a la página de verificación. SihasData
esfalse
ohasError
estrue
, retorno un widgetCircularProgressIndicator
para indicar que los datos aún se están cargando.