Вложенный запрос Firestore во флаттере для построения списка - PullRequest
1 голос
/ 05 октября 2019

У меня есть две коллекции в моей базе данных Firestore;«запросы» и «пользователи». Мое требование состоит в том, чтобы получить все запросы относительно определенного флага из коллекции «запросов». После этого мне нужно проверять uid в каждом запросе и запрашивать данные моего пользователя, используя этот uid из коллекции "users". В этом случае я выбираю имя пользователя и номер, используя StreamBuilder в флаттере. Ниже мой подход:

return new StreamBuilder(
  stream: db.collection("queries").where("isAttended", isEqualTo: false).snapshots(),
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
    if(!snapshot.hasData) return new Text("Loading...");
    return new ListView(
      children: snapshot.data.documents.map((document){
        String name = '';
        String number = '';
        var doc = db.collection("users").document(document["uid"]).get();
        doc.then((onValue) {
          number  = onValue.data['number'];
          name = onValue.data['name'];
        });
       return new ListTile(
         title: new Text(name),
         subtitle: new Text(number),
       ); 
      }).toList(),
    );
  },

);

Проблема в том, что onValue возвращает ноль. Посоветуйте, пожалуйста, мой подход для запроса данных в порядке, указанном выше. ТИА.

1 Ответ

0 голосов
/ 05 октября 2019

Давайте начнем,

Это список ваших детей List<Widget> children = [];

Измените ListView детей на ListView(children: children, ...)

И обновите ваш streambuilder таким образом,

if(!snapshot.hasData) return new Text("Loading...");
initChildren(snapshot); // here is important
return new ListView(...

А initChildren является

initChildren(snapshot) async {
  final list = await Future.wait(snapshot.data.documents.map((document) async {
    String name = '';
    String number = '';
    var doc = await db.collection("users").document(document["uid"]).get();
    doc.then((onValue) {
      number = onValue.data['number'];
      name = onValue.data['name'];
    });
    return new ListTile(
      title: new Text(name),
      subtitle: new Text(number),
    );
  }));
  setState(() => children = list);
}
...