【问题标题】:The operator '[]' isn't defined for the type 'DocumentSnapshot'未为“DocumentSnapshot”类型定义运算符“[]”
【发布时间】:2020-12-09 11:45:57
【问题描述】:

[这里是错误] 我在另一个类中创建了构造函数,但它不起作用。

这里是代码...

  body: StreamBuilder<QuerySnapshot>(
    stream: FirebaseFirestore.instance.collection("products").snapshots(),
    builder: (context, snapshot) {
      return !snapshot.hasData
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: snapshot.data.docs.length,
              itemBuilder: (context, index) {
                DocumentSnapshot data = snapshot.data.docs[index];
                return ProductItem(
                  documentSnapshot: data,
                  id: data.id,
                  isFavourite: data['isFavourite'],
                  imageUrl: data['imageUrl'],
                  productName: data['productName'],
                  productPrice: data['productPrice'],
                );
              },
            );
    },
  ),
);
}
}

【问题讨论】:

  • 嗨,您可以提供完整的代码吗?
  • 这里是代码
  • 什么是 snapshot.data.docs[index]?这是返回数组
  • 是的,它将数据作为数组返回
  • 列表 data = snapshot.data.docs[index];

标签: flutter google-cloud-firestore


【解决方案1】:

您必须将数据类型设置为字符串,以便地图最新的 Firestore 执行此问题。

Map<String, dynamic> data = user.data(); 
currentUser.name = data['name']; 

在模块小部件的 main.dart 中

itemBuilder: (context, index) {
                DocumentSnapshot ds = snapshot.data.documents[index];
                Map<String, dynamic> data = ds.data();
                print(ds);
                return Container(
                  child: ListTile(
                    title: Text(
                      data['name'],
                    ),
                  ),
                );

在函数的模型类中使用下面的链接

 List<Users> _brewListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((doc) {
  Map<String, dynamic> data = doc.data();
  return Users(
    name: data['name'] ?? '',
    email: data['email'] ?? '',
  );
}).toList();

}

【讨论】:

    【解决方案2】:
    I think first you should create a class for your products and write a method
    for parsing data that comes from api.
    
    class Product{
       String id:
       String name;
       String quantity;
    
     Product({this.id,this.name,this.quantity});
    
       factroy Product.fromJson(Map<String,dynamic> json) => Product(
          id : json['id'],
          name : json['name'],
          quantity : json['quantity']);
       }
    
      Create a list of product which you wanna parse your data.
      => List<Product> products = List<Product>(); //let say home page
    
      make a request to api and when the condition is fine for parsing data, assing
      snapshot data to the list that we've created under State<yourWidget>.
    
      body: StreamBuilder<QuerySnapshot>(
          stream: FirebaseFirestore.instance.collection("products").snapshots(),
          builder: (context, snapshot) {
      if(snapshot.connectionState == ConnectionState.done && snapshot.hasData) {
               return ListView.builder(
                itemCount: products.length,
                itemBuilder: (context, index) {
                return Product(
                  id: products[index].id,
                  isFavourite: products[index].name,
                  imageUrl: products[index].quantity,
                );
              },
            );
             } else {
          return Center(child: CircularProgressIndicator());
              }
    
            },
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案3】:

      您正在使用 ^0.14.0。直接调用 [] 已弃用

       body: StreamBuilder<QuerySnapshot>(
          stream: FirebaseFirestore.instance.collection("products").snapshots(),
          builder: (context, snapshot) {
            return !snapshot.hasData
                ? Center(child: CircularProgressIndicator())
                : ListView.builder(
                    itemCount: snapshot.data.docs.length,
                    itemBuilder: (context, index) {
                      DocumentSnapshot data = snapshot.data.docs[index];
                      return ProductItem(
                        documentSnapshot: data,
                        id: data.id,
                        isFavourite: data.data()['isFavourite'],
                        imageUrl: data.data()['imageUrl'],
                        productName: data.data()['productName'],
                        productPrice: data.data()['productPrice'],
                      );
                    },
                  );
          },
        ),
      );
      }
      }
      

      【讨论】:

        【解决方案4】:

        试试这个,

          body: StreamBuilder<QuerySnapshot>(
            stream: FirebaseFirestore.instance.collection("products").snapshots(),
            builder: (context, snapshot) {
              return !snapshot.hasData
                  ? Center(child: CircularProgressIndicator())
                  : ListView.builder(
                      itemCount: snapshot.data.docs.length,
                      itemBuilder: (context, index) {
                        DocumentSnapshot data = snapshot.data[index];
        Map getDocs = data.data; 
                        return ProductItem(
                          documentSnapshot: data,
                          id: data.id,
                          isFavourite: getDocs['isFavourite'],
                          imageUrl: getDocs['imageUrl'],
                          productName:getDocs['productName'],
                          productPrice: getDocs['productPrice'],
                        );
                      },
                    );
            },
          ),
        );
        }
        }
        

        【讨论】:

        • 如果不行,请将snapshot.data[index]替换为snapshot.data.docs[index]
        • 如果有帮助,请点赞并接受这个答案:)
        • 为了记录,你需要使用StreamBuilder()。在使用 => 表达式的情况下,您必须消除胖运算符并使用 itemBuilder {DocumentSnapshot data = snapshot.data.docs[index];} 的大括号声明
        • 嘿@MadhavamShahi 我在另一个项目中遇到了同样的问题无法解决它你能帮忙吗?
        • 好的,这是我的电子邮件 business.madhavam@gmail.com @Robel
        猜你喜欢
        • 2020-12-20
        • 2021-11-30
        • 2021-06-11
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 2021-10-01
        • 2021-01-29
        相关资源
        最近更新 更多