FutureBuilder не может «видеть» данные / снимок.hasData

# #firebase #flutter #google-cloud-firestore

Вопрос:

У меня есть будущая функция для получения данных из Firebase, которая неправильно выполняет пустые запросы:

 Future getProducts(vendorId) async {  await vendorsInfoColl.doc(vendorId)  .collection("products")  .get()  .then((QuerySnapshot querySnapShot) async {  if (querySnapShot.docs.isNotEmpty){  print('not empty');  print(querySnapShot.docs);  return querySnapShot.docs;  } else {  print('snapshot empty');  return null;  }  }); }  

Мне просто трудно заставить будущего строителя увидеть это. Все время говорит, что есть пустые данные.

 Widget build(BuildContext context) {  return AlertDialog(  // pull title from db  // title: Future Text(vendorTitle.toString()),  title: Text(vendorTitle.toString()),  content: FutureBuilder(  future: VendorDatabase().getProducts(widget.vendorId),  builder: (BuildContext context, AsyncSnapshot snapshot) {  print(snapshot.connectionState);  if (snapshot.connectionState == ConnectionState.waiting) {  return CircularProgressIndicator();  } else if (snapshot.connectionState == ConnectionState.done) {  if (snapshot.hasError) {  return const Text('Error');  } else if (snapshot.hasData) {  var blabla = snapshot.data;  print('there is snapshot data: $blabla');  return ListView.builder(  itemCount: 3,  itemBuilder: (context, index) {  return ListTile(  title: Text(blabla['products']) //lt;-- i know this is wrong but can't fixt it till future builder actually sees some data.  );  }  );  } else {  return const Text('Empty data');  }  } else {  return Text('State: ${snapshot.connectionState}');  }  }  )  ); }  

Было бы здорово, если бы вы также могли получить несколько советов о том, как внести это в список 🙂

Комментарии:

1. ваш getProducts метод async один, поэтому используйте только await то, что внутри него — теперь вы также вызываете Future.then , что только усложняет ваш код — теперь getProducts всегда возвращает null

Ответ №1:

Ты ничего не вернешь внутрь getProducts :

 Future getProducts(vendorId) async {  return await vendorsInfoColl.doc(vendorId)  .collection("products")  .get()  .then((QuerySnapshot querySnapShot) async {  if (querySnapShot.docs.isNotEmpty){  return querySnapShot.docs;  } else {  return null;  }  }); }  

Чтобы избежать этого в будущем, объявите тип в своем будущем:

 // vvvvvvvvvvvvvvvv Futurelt;Listlt;Documentgt;gt; getProducts(vendorId) async {