Flutter obtiene un valor booleano de Futuro pero obtuvo nulo asignado a la variable Booleana.
Estoy obteniendo un error cuando intento obtener el resultado booleano de un Future<bool>
en Flutter. El escenario es que estoy intentando hacer una consulta en Firebase Firestore asociado con mi proyecto, y comprobar si la consulta no contiene ningún elemento. Por lo tanto, utilizo este fragmento de código para hacer la consulta y devolverla como un Future<bool>
:
static Future<bool> checkDupTitle (String uid, String title) {
return FirebaseFirestore.instance
.collection(DBCollection.summits.toString())
.where(SummitWhirlwindModel.UID, isEqualTo: uid)
.where(SummitWhirlwindModel.TITLE, isEqualTo: title)
.snapshots().isEmpty;
}
Para obtener el resultado booleano del Future<bool>
, he intentado tanto la sintaxis de async
/await
como la de .then
. Desafortunadamente, ninguno de ellos funciona. Por ejemplo, cuando uso .then
, obtengo el valor booleano de containsDup
asignado a null
, como se muestra a continuación:
bool isValid(String uID) {
Future<bool> containsDupFuture = checkDupTitle(uID, this.title.value);
bool containsDup;
containsDupFuture.then((value) => containsDup = value);
return !containsDup;
}
¿Alguien puede ayudarme con este problema? Soy nuevo en Flutter y cuando busco las preguntas relacionadas en Stackoverflow, no puedo obtener respuestas valiosas para mi caso. ¡Muchas gracias por responder a esta pregunta de antemano!
davy.ai
El problema con el código es que
snapshots().isEmpty
devuelve un valor de tipobool
que indica si el flujo está vacío o no. Sin embargo, necesitamos devolvertrue
si está vacío yfalse
si no lo está.Para resolver este problema, podemos utilizar el método
get()
en lugar desnapshots()
. El métodoget()
devuelve un futuro que se resuelve en unQuerySnapshot
que tiene una propiedadsize
que se puede utilizar para comprobar si la consulta contiene algún documento o no.La función actualizada
checkDupTitle
se vería así:Luego, la función
isValid
se puede modificar de la siguiente manera, utilizandoawait
para obtener el valor booleano del futuro:Esto debería resolver el problema y devolver el valor booleano correcto.