TransWikia.com

¿Como almacenar un Future en una variable? Dart

Stack Overflow en español Asked by xelo candia on December 12, 2020

Tengo una consulta sobre algo que no puedo solucionar.
Tengo un método que me genera una ID de producto, luego de hacer una query en firestore (el método lo muestro a continuación)

_obtenerCodProd(tipo) async {

    final QuerySnapshot snapshot = await Firestore.instance
        .collection('productos')
        .where("tipo", isEqualTo: tipo.toString())
        .getDocuments();

    String idLetra;

    if (tipo == "Snack") {
      idLetra = "SNK";
    }
    if (tipo == "Fruta") {
      idLetra = "FRU";
    }
    if (tipo == "Lácteo") {
      idLetra = "LAC";
    }
    if (tipo == "Líquido") {
      idLetra = "LIQ";
    }
    if (tipo == "Café") {
      idLetra = "CAF";
    }

    var cantidad_tipo = int.parse(snapshot.documents.length.toString());
    String idnumerico;
    int sumaID;
    sumaID = cantidad_tipo + 1;
    if (sumaID < 10) {
      idnumerico = "00$sumaID";
    }
    if (sumaID >= 10) {
      idnumerico = "0$sumaID";
    }
    if (sumaID >= 100) {
      idnumerico = "$sumaID";
    }
    print("cantidad_tipo: $cantidad_tipo");
    print("idnumerico: $idnumerico");

    return "Codigo de producto: $idLetra$idnumerico";
  }

Lo que me retorna ese metodo es un codigo de prducto.

Aquí se muestra con "Codigo de producto" lo que retorna el metodo

Pero cuando trato de almacenar ese return en una variable, y le hago un print, me dice que es un Future

// ALMACENAR ID PRODUCTO //
            var resultado = _obtenerCodProd(tipoSeleccionado);
            print(resultado);

Este es el future

Necesito almacenar ese Future que seria la id del producto, pero cuando lo almaceno y le hago un print me aparece que es un Future y no el valor que yo necesito en realidad.
Si hago un print directamente al metodo, tambien me muestra en pantalla que es un Future.
Pero aun así logre hacer que el print directamente al metodo me mostrara el varlo que quiero, pero no logro almacenarlo.
Por favor si pudieran ayudarme con eso, estaría muy agradecido
Muchas gracias de antemano

Gracias de antemano

2 Answers

El "snapshot" esta bien resuelto, porque retorna un Future y lo estás resolviendo en la misma variable anteponiendo "await". Ahora el problema puede estar en la variable "cantidad_tipo", al llamar "snapshot.documents", "documents" puede ser otro Future y no lo estás resolviendo. Finalmente cuando vayas a llamar a "_obtenerCodProd", que es un Future por "async", deberas resolverlo de la misma manera, si vas a implementar en la ui:

FutureBuilder<String>(
    future: _obtenerCodProd("Fruta"),
    builder: (context, snapshot) {
        // Logica...
    }
)

Answered by Feloo on December 12, 2020

Lo que te está retornando es un Future porque es una petición asíncrona, lo que debes hacer es esperar por el resultado usando await.

Es decir, lo que implícitamente te está retornando _obtenerCodProd ese método es :

Future<String> _obtenerCodProd.

Cómo obtienes el String? Usando async/await así :

tuMetodo() async {

var resultado = await _obtenerCodProd(tipoSeleccionado);
            print(resultado);

}

Ahora resultado será un String. Te recomiendo que revises FutureBuilder , StatefulWidget, StreamBuilder, son widgets que te podrían servir.

Answered by diegoveloper on December 12, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP