Не удается извлечь данные из вложенного объекта firestore streambuilder listview

# #flutter #google-cloud-firestore

Вопрос:

Я новичок в firestore, поэтому все еще пытаюсь это понять.

у меня были Шкафы, внутри у меня была Одежда. я хочу получить данные об одежде и показать их с помощью listview. проблема в том, что мне не удалось извлечь данные и показать их в приложении

это мой код для streambuilder

 StreamBuilder<QuerySnapshot>(
                              stream: FirebaseFirestore.instance.collection("clothes").snapshots(),
                              builder: (BuildContext context,
                                  AsyncSnapshot<QuerySnapshot> snapshot) {
                                if (snapshot.hasError) {
                                  return Text("Failed to load data!");
                                }
                                if (snapshot.connectionState ==
                                    ConnectionState.waiting) {
                                  return ActivityServices.loadings();
                                }
                                return new ListView(
                                  children: snapshot.data.docs
                                      .map((DocumentSnapshot doc) {
                                    Clothes clothes;
                                    clothes = new Clothes(
                                      doc.data()['clothesId'],
                                      doc.data()['clothesName'],
                                      doc.data()['clothesDesc'],
                                      doc.data()['clothesImage'],
                                      doc.data()['clothesCloset'],
                                      doc.data()['clothesAge'],
                                      doc.data()['clothesTag'],
                                      doc.data()['clothesStatus'],
                                      doc.data()['clothesLaundry'],
                                      doc.data()['createdAt'],
                                      doc.data()['updatedAt'],
                                    );
                                    print(doc.data()['clothesName']);
                                    return CardClothesLemari(clothes: clothes);
                                  }).toList(),
                                );
                              },
                            ),
 

а это моя визитная карточка, Лемари

   final Clothes clothes;

  CardClothesLemari({this.clothes, this.doc});
  @override
  _CardClothesLemariState createState() => _CardClothesLemariState();
}

class _CardClothesLemariState extends State<CardClothesLemari> {
  @override
  Widget build(BuildContext context) {
    Clothes cloth = widget.clothes;
    final Size size = MediaQuery.of(context).size;
    if (clothes == null) {
      return Container();
    } else {
      return Padding(
          padding:
              EdgeInsets.only(top: 5.0, bottom: 5.0, left: 5.0, right: 5.0),
          child: InkWell(
              onTap: () {
                Navigator.pushNamed(context, DetailClothes.routeName,
                    arguments: cloth);
              },
              child: Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(14.0),
                    boxShadow: [
                      BoxShadow(
                          color: Colors.grey.withOpacity(0.2),
                          spreadRadius: 3.0,
                          blurRadius: 5.0)
                    ],
                    color: Color(0xffA77665),
                  ),
                  child: Column(children: [
                    Padding(
                      padding: EdgeInsets.only(top: size.height * 0.04),
                    ),
                    Hero(
                      tag: 'assets/images/dummy.jpg',
                      child: CircleAvatar(
                        radius: 55,
                        backgroundImage: AssetImage("assets/images/dummy.jpg"),
                      ),
                    ),
                    SizedBox(height: 7.0),
                    Text(
            //show clothes name
                      cloth.clothes,
                      style: TextStyle(
                          fontSize: 14,
                          fontFamily: GoogleFonts.openSans().fontFamily,
                          fontWeight: FontWeight.w700,
                          color: Color(0xffF0E8E1)),
                      textAlign: TextAlign.center,
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 8),
                      child:
                          Container(color: Color(0xFFEBEBEB), height: 2.9657),
                    ),
                  ]))));
    }
  }
}
 

это скриншот моего магазина firestore

Ответ №1:

Добавьте представление списка в состояние подключения.сделано, как показано ниже кода.

 if (snapshot.connectionState == ConnectionState.done) {
                                   return new ListView(
                                  children: snapshot.data.docs
                                      .map((DocumentSnapshot doc) {
                                    Clothes clothes;
                                    clothes = new Clothes(
                                      doc.data()['clothesId'],
                                      doc.data()['clothesName'],
                                      doc.data()['clothesDesc'],..........<Rest of the code>......
                          }
 

Ответ №2:

В соответствии со структурой вашей базы данных вы вводите неправильный запрос. Пожалуйста, взгляните на приведенный ниже код

 StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
  stream: FirebaseFirestore.instance
          .collection('closet')
          .doc('your_document_id')
          .collection('clothes')
          .snapshots(),
  builder: (context, snapshot) {
           if (!snapshot.hasData) {
             return Text('Loading...');
            } else {
             return ListView.builder(
              itemCount: snapshot.data.docs.length,
              shrinkWrap: true,
              itemBuilder: (context, int index) {
              QueryDocumentSnapshot<Map<String, dynamic>> data = snapshot.data.docs[index];
              return Text(data.data()['clothesName']);
             },
            );
          }
        });