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.

Error: No se puede devolver un valor de tipo ‘Future‘ desde una función con un tipo de retorno ‘Widget’.

Estoy intentando leer datos de Cloud Firestore (funcionando) y colocar los datos en un ListView que contiene un widget gráfico (Order) que muestra el precio, la fecha y el producto, pero cuando intento devolver los datos desde el método, aparece este error.

El objetivo es devolver los datos del usuario pasado al constructor dbutility.

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

import 'order.dart';

class db<em>utility extends StatelessWidget {
  final String userID;
  const db</em>utility(this.userID, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    CollectionReference users = FirebaseFirestore.instance.collection('users');
    return FutureBuilder(
      future: users.doc(userID).get(),
      builder:
          (BuildContext context, AsyncSnapshot<documentsnapshot> snapshot) {
        if (snapshot.hasError) {
          return const Text("error");
        } else if (snapshot.hasData && !snapshot.data!.exists) {
          return const Text("no data found");
        } else if (snapshot.connectionState == ConnectionState.done) {
          Map<string, dynamic=""> data =
              snapshot.data!.data() as Map<string, dynamic="">;
          return getListOfOrders();
        }
        return const Center(
          child: CircularProgressIndicator(
            color: Colors.red,
          ),
        );
      },
    );
  }

Y este es el método que devuelve el ListView:
Future<listview> getListOfOrders() async {
QuerySnapshot snapshot = await FirebaseFirestore.instance
.collection('completed_orders')
.where('user', isEqualTo: userID)
.orderBy('timestamp')
.get();
final data = snapshot.docs.map((doc) => doc.data()).toList();
List<order> orders = <order>[];
for (var o in data) {
orders.add(Order((o as Map)['price'], 'date of today', o['product']));
}
return ListView(children: orders,);
}
}
</string,></string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error que aparece al intentar devolver los datos del método no se proporciona en los fragmentos de código dados. Sin embargo, un posible problema con el código es que getListOfOrders() no se llama en ninguna parte del widget db_utility. Para solucionarlo, podemos llamar a getListOfOrders() dentro del método builder del FutureBuilder.

    Aquí está el código actualizado:

    import 'package:flutter/material.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';
    
    import 'order.dart';
    
    class db_utility extends StatelessWidget {
      final String userID;
      const db_utility(this.userID, {required Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        CollectionReference users = FirebaseFirestore.instance.collection('users');
        return FutureBuilder(
          future: users.doc(userID).get(),
          builder: (BuildContext context, AsyncSnapshot<documentsnapshot> snapshot) {
            if (snapshot.hasError) {
              return const Text("error");
            } else if (snapshot.hasData && !snapshot.data!.exists) {
              return const Text("no data found");
            } else if (snapshot.connectionState == ConnectionState.done) {
              Map<string, dynamic=""> data = snapshot.data!.data() as Map<string, dynamic="">;
              return FutureBuilder(
                future: getListOfOrders(),
                builder: (BuildContext context, AsyncSnapshot<listview> snapshot) {
                  if (snapshot.hasData) {
                    return snapshot.data!;
                  } else {
                    return const Center(
                      child: CircularProgressIndicator(
                        color: Colors.red,
                      ),
                    );
                  }
                },
              );
            }
            return const Center(
              child: CircularProgressIndicator(
                color: Colors.red,
              ),
            );
          },
        );
      }
    
      Future<listview> getListOfOrders() async {
        QuerySnapshot snapshot = await FirebaseFirestore.instance
            .collection('completed_orders')
            .where('user', isEqualTo: userID)
            .orderBy('timestamp')
            .get();
        final data = snapshot.docs.map((doc) => doc.data()).toList();
        List<order> orders = [];
        for (var o in data) {
          orders.add(Order((o as Map)['price'], 'date of today', o['product']));
        }
        return ListView(children: orders);
      }
    }
    

    En este código actualizado, agregamos otro FutureBuilder dentro del widget db_utility, que llama de forma asíncrona a getListOfOrders() y construye el widget ListView cuando el Future se completa. También actualizamos las declaraciones Import para cumplir con la seguridad de nulos de Dart 2, es decir, utilizamos required en lugar de Key?.</string,></string,>

Comments are closed.