Flutter 如何在Flatter FutureBuilder中引用Firestore documentID

Flutter 如何在Flatter FutureBuilder中引用Firestore documentID,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我有一个工作代码,可以使用Future和QuerySnapshot从Firestore获取一个集合(“歌曲”)。我在一个小函数getSongs()中有这个函数。当我在该功能中时,我可以访问文档的ID。。。如果我打电话给你,你会说: 打印(songsQuery.documents[1].documentID) 我得到-LSvpZxM2pUIYjjp0qby 但稍后在我的代码中,我使用了一个FutureBuilder,在其中我为future:调用getSongs(),然后从构建器中的快照生成一个包含

我有一个工作代码,可以使用Future和QuerySnapshot从Firestore获取一个集合(“歌曲”)。我在一个小函数getSongs()中有这个函数。当我在该功能中时,我可以访问文档的ID。。。如果我打电话给你,你会说:

打印(songsQuery.documents[1].documentID)

我得到-LSvpZxM2pUIYjjp0qby

但稍后在我的代码中,我使用了一个FutureBuilder,在其中我为future:调用getSongs(),然后从构建器中的快照生成一个包含歌曲信息(艺术家、标题等)的列表视图:

当我现在在这个小部件中时,我似乎再也不知道如何引用我的.documentID了。我可以获取每个文档的所有.data元素…但不能获取实际的documentID

有什么很明显的东西我遗漏了吗

谢谢你的帮助

我在互联网上搜索,试图解决问题,但运气不佳。似乎很多人都会获取文档列表,将它们加载到一个数组中,添加doc.id,然后将其全部推到一个项目数组中。然后使用项目。我只想使用从Firestore渲染回来的快照,如果可能的话,直接引用doc.id

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';

class AllSongs extends StatelessWidget {
Future getSongs() async {
  var firestore = Firestore.instance;
  QuerySnapshot songsQuery = await      firestore.collection('songs').getDocuments();

print(songsQuery.documents[1].documentID); 
//Here I can get to documentID...

return songsQuery.documents;
}
  @override
  Widget build(BuildContext context) {
    return Center(
      child: FutureBuilder(
        future: getSongs(),
        builder: (_, songSnapshots){

      print('How do I reference the DocumentID in here?');
      print(songSnapshots.data.length);
      print(songSnapshots.data[0].data['title']);
      //print(songSnapshots.data[0].documentID);
      //print(songSnapshots.data[0].ref);
      //print(songSnapshots.data[0].data[ DOCUMENTID?? ]);

      if(songSnapshots.connectionState == ConnectionState.waiting){
        return Center(
          child: Text('Loading...'),
        );
      } else {
        return ListView.builder(
          itemCount: songSnapshots.data.length ,
          itemBuilder: (_, index){
            return ListTile(
            title: Text(songSnapshots.data[index].data['title']),
            subtitle: Text(songSnapshots.data[index].data['artist']),
            );
        });
      }
    },
  )

);
}
}

你试图在未来的价值解决之前获取它的价值

尝试添加以下行:

if (!songSnapshots.hasData) {
    // Future hasn't resolved
    return something;
}
// Future has resolved, you can access your data (including documentId)

您的未来将解析为一个
DocumentSnapshot
列表,因此只需等待未来解析,您就可以访问所有数据。或者,您可以尝试在连接状态未等待的else语句中访问该语句,但在这种情况下,您认为任何非等待状态都是成功的,因此我建议使用
AsyncSnapshot
类的
hasData
属性。

您尝试在解析未来之前访问未来的值

尝试添加以下行:

if (!songSnapshots.hasData) {
    // Future hasn't resolved
    return something;
}
// Future has resolved, you can access your data (including documentId)

您的未来将解析为一个
DocumentSnapshot
列表,因此只需等待未来解析,您就可以访问所有数据。或者,您可以尝试在连接状态未等待的else语句中访问该语句,但是在这种情况下,您认为任何非等待状态都是成功的,因此我建议使用
AsyncSnapshot
类的
hasData
属性。

阅读并仔细阅读它,不是因为您在SongSnapshot准备好之前调用了print吗?如果你在未来完成后再打电话会怎么样?我有数据。。。。未来已经解决。。。我对返回的数据没有问题。。。。。我可以得到所有的数据值(xxxx.data[index].data['title']…['artist'],等等…这是我不知道如何获取的文档ID。请仔细阅读并仔细阅读,不是吗,因为您在歌曲快照准备好之前调用print?如果您在将来完成后调用它会发生什么?我有数据…未来已解决…我对返回的数据没有问题…我可以获取所有数据值(xxxx.data[index].data['title']…['artist']等…。我不知道如何获取文档ID。我拥有数据…未来已经解决…我对返回的数据没有问题…我可以获取所有数据值(xxxx.data[index].data['title']…['artist'],等等……这是我不知道如何获取的documentID。因此,在您的评论中,您写道://Future已解决,您可以访问您的数据(包括documentID)“……假设我已解决数据(我已解决)…我将如何访问documentId?这是主要问题。一旦我有了快照…我可以获取文档中的数据元素…但我看不到任何直接获取docId的方法。这毫无意义,您可以访问数据属性的字段这一事实意味着快照数据字段的每个元素实际上都是一个文档ument snapshot在这种情况下,您应该能够执行
snapshot.data[0]。documentID
是否尝试打印
snapshot.data[0]
?哇……我的错……我不知道我以前是怎么没有做到这一点的。也许我盯着它看得太久了。我想在过去的努力中,我可能没有将ID完全大写……谢谢你的帮助。我有数据……未来已经解决了……我没有返回数据的问题……我可以获取所有数据值(xxxx.data)[index].data['title']…['artist']等..这是我不知道如何获取的documentID。因此,在您的评论中,您写道://Future已解决,您可以访问您的数据(包括documentID)…假设我已解决数据(我已解决)…我将如何访问documentId?这是主要问题。一旦我有了快照…我可以获取文档中的数据元素…但我看不到任何直接获取docId的方法。这毫无意义,您可以访问数据属性的字段这一事实意味着快照数据字段的每个元素实际上都是一个文档ument snapshot在这种情况下,您应该能够执行
快照。数据[0]。documentID
您是否尝试过打印
快照。数据[0]
?哇……我的错……我不知道我以前是如何无法实现此功能的。可能盯着它看得太久了。我想在过去的工作中,我可能没有完全大写ID……谢谢您的帮助。