Firebase 获取ListView上已单击的项目Firestore文档id

Firebase 获取ListView上已单击的项目Firestore文档id,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,在这里,我编写了访问集合中所有文档的代码,并将其显示在ListView中 下面是获取数据的方法 Future getData() async { var firestore = Firestore.instance; QuerySnapshot qn = await firestore.collection("LiveProducts").getDocuments(); return qn.documents; } 这是我的构建方法 @override Widg

在这里,我编写了访问集合中所有文档的代码,并将其显示在ListView中

下面是获取数据的方法

Future getData() async {
    var firestore = Firestore.instance;
    QuerySnapshot qn =
    await firestore.collection("LiveProducts").getDocuments();
    return qn.documents;
}
这是我的构建方法

@override
Widget build(BuildContext context) {
return Container(
    child: FutureBuilder(
        future: getData(),
        builder: (_, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Padding(
              padding: const EdgeInsets.only(
                top: 295,
              ),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: <Widget>[
                  Center(
                    child: SpinKitCircle(
                      color: Colors.deepPurpleAccent,
                      size: 50.0,
                    ),
                  ),
                ],
              ),
            );
          } else {
            return ListView.builder(
              // title: Text(snapshot.data[index].data["ProductName"]),
              shrinkWrap: true,
              itemCount: snapshot.data.length,
              itemBuilder: (_, index) {
                return InkWell(
                  onTap: onClick,
                  child: Container(
                    child: Container(
                      margin: EdgeInsets.all(15),
                      height: 300,
                      width: double.infinity,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(20),
                        image: DecorationImage(
                          image: NetworkImage(snapshot
                              .data[index].data["ProductImageLink"]),
                          fit: BoxFit.cover,
                        ),
                        boxShadow: [
                          BoxShadow(
                            color: Colors.deepPurpleAccent,
                            blurRadius: 8,
                            offset: Offset(0, 10),
                          )
                        ],
                      ),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: <Widget>[
                          Row(
                            children: <Widget>[
                              Expanded(
                                child: Padding(
                                  padding: const EdgeInsets.all(15.0),
                                  child: Column(
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: <Widget>[
                                      Text(
                                        // name,
                                        snapshot.data[index]
                                            .data["ProductName"],
                                        style: TextStyle(
                                            color: Colors.white,
                                            fontSize: 30,
                                            fontWeight: FontWeight.bold),
                                      ),
                                      SizedBox(
                                        height: 10,
                                      ),
                                      Text(
                                        // type,
                                        // '',
                                        snapshot.data[index]
                                            .data["ProductCompany"],
                                        style: TextStyle(
                                            color: Colors.white,
                                            fontSize: 20,
                                            fontWeight: FontWeight.bold),
                                      ),
                                    ],
                                  ),
                                ),
                              ),
                            ],
                          ),
  void onClick() {
  Navigator.of(context).push(MaterialPageRoute(builder: (_) {
   return PlacingBids();
  }));
}
@覆盖
小部件构建(构建上下文){
返回容器(
孩子:未来建设者(
future:getData(),
构建器:(\uux,快照){
if(snapshot.connectionState==connectionState.waiting){
返回填充(
填充:仅限常量边设置(
排名:295,
),
子:列(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
居中(
孩子:斯宾基特圆(
颜色:颜色。深紫色,
尺寸:50.0,
),
),
],
),
);
}否则{
返回ListView.builder(
//标题:文本(快照.数据[索引].数据[“ProductName]”),
收缩膜:对,
itemCount:snapshot.data.length,
itemBuilder:(\ux,索引){
回墨槽(
onTap:onClick,
子:容器(
子:容器(
保证金:所有(15),
身高:300,
宽度:double.infinity,
装饰:盒子装饰(
边界半径:边界半径。圆形(20),
图像:装饰图像(
图像:网络图像(快照)
.data[index].data[“ProductImageLink”],
适合:BoxFit.cover,
),
boxShadow:[
箱形阴影(
颜色:颜色。深紫色,
半径:8,
偏移量:偏移量(0,10),
)
],
),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
划船(
儿童:[
扩大(
孩子:填充(
填充:常数边集全部(15.0),
子:列(
横轴对齐:
CrossAxisAlignment.start,
儿童:[
正文(
//名字,
快照.数据[索引]
.data[“ProductName”],
样式:TextStyle(
颜色:颜色,白色,
尺寸:30,
fontWeight:fontWeight.bold),
),
大小盒子(
身高:10,
),
正文(
//类型,
// '',
快照.数据[索引]
.数据[“产品公司”],
样式:TextStyle(
颜色:颜色,白色,
尺寸:20,
fontWeight:fontWeight.bold),
),
],
),
),
),
],
),
void onClick(){
Navigator.of(context).push(MaterialPageRoute(builder:){
返回贴牌投标();
}));
}
我已在ListView中列出了所有文档,但我面临一个问题。我需要获取ListView中已单击文档的Firestore id。如何操作?

类有一个返回文档密钥的
id
属性

您可以使用
gesturedector
包装列表项,并将文档id传递给ònTap`回调

@override
  Widget build(BuildContext context) {
    return Container(
      child: FutureBuilder(
        future: getData(),
        builder: (_, AsyncSnapshot<List<DocumentSnapshot>> snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              itemBuilder: (_, index) {
                return GestureDetector(
                  onTap: () {
                    print("Item with key " +
                        snapshot.data[index].id +
                        " clicked.");
                  },
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(snapshot.data[index].data["ProductName"]),
                  ),
                );
              },
              itemCount: snapshot.data.length,
            );
          }
          return Container();
        },
      ),
    );
  }
@覆盖
小部件构建(构建上下文){
返回容器(
孩子:未来建设者(
future:getData(),
生成器:(\ux,异步快照){
if(snapshot.hasData){
返回ListView.builder(
itemBuilder:(\ux,索引){
返回手势检测器(
onTap:(){
打印(“带密钥的项目”+
snapshot.data[index].id+
“点击”。);
},
孩子:填充(
填充:常数边集全部(8.0),
子项:文本(快照.数据[索引].数据[“ProductName]”),
),
);
},
itemCount:snapshot.data.length,
);
}
返回容器();
},
),
);
}

什么是
getData()
返回的?它返回所有的文档您已经提供了代码,很抱歉我错过了那部分。没关系。我正在编写解决方案。先生,实际打印(“带有键的项”+快照。数据[索引]。id+“单击”。);此操作不起作用。此操作给出了错误类“DocumentSnapshot”