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 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!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que snapshots().isEmpty devuelve un valor de tipo bool que indica si el flujo está vacío o no. Sin embargo, necesitamos devolver true si está vacío y false si no lo está.

    Para resolver este problema, podemos utilizar el método get() en lugar de snapshots(). El método get() devuelve un futuro que se resuelve en un QuerySnapshot que tiene una propiedad size que se puede utilizar para comprobar si la consulta contiene algún documento o no.

    La función actualizada checkDupTitle se vería así:

    static Future<bool> checkDupTitle (String uid, String title) async {
        QuerySnapshot snapshot = await FirebaseFirestore.instance
              .collection(DBCollection.summits.toString())
              .where(SummitWhirlwindModel.UID, isEqualTo: uid)
              .where(SummitWhirlwindModel.TITLE, isEqualTo: title)
              .get();
        return snapshot.size == 0;
    }
    

    Luego, la función isValid se puede modificar de la siguiente manera, utilizando await para obtener el valor booleano del futuro:

    bool isValid(String uID) async {
        bool containsDup = await checkDupTitle(uID, this.title.value);
        return !containsDup;
    }
    

    Esto debería resolver el problema y devolver el valor booleano correcto.

Comments are closed.