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 {
</string,></string,>
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,);
}
}
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 widgetdb_utility
. Para solucionarlo, podemos llamar agetListOfOrders()
dentro del métodobuilder
delFutureBuilder
.Aquí está el código actualizado:
En este código actualizado, agregamos otro
FutureBuilder
dentro del widgetdb_utility
, que llama de forma asíncrona agetListOfOrders()
y construye el widgetListView
cuando elFuture
se completa. También actualizamos las declaracionesImport
para cumplir con la seguridad de nulos de Dart 2, es decir, utilizamosrequired
en lugar deKey?
.</string,></string,>