如何在Flutter FutureBuilder中引用Firestore documentID

时间:2019-05-16 02:32:05

标签: flutter google-cloud-firestore

我有工作代码,可以使用Future和QuerySnapshot从Firestore获取集合(“歌曲”)。我有一个小的函数getSongs()。在该函数内部时,我可以访问文档的ID ...因此,如果我打电话说:

print(songsQuery.documents [1] .documentID);

我得到-LSvpZxM2pUIYjjp0qby

但是稍后在我的代码中,我使用FutureBuilder,将来我会调用getSongs():然后从构建器中的快照中构建带有歌曲信息图块(艺术家,标题等)的ListView。 >

虽然我现在在此小部件中,但似乎无法弄清楚如何引用我的.documentID。我可以获取每个文档的所有.data元素...但不能获取实际的documentID。

我很想念什么吗?

感谢您的帮助。

ER

我搜寻了互联网,但没有运气就试图解决。似乎很多人都将文档列表拿来,将它们加载到数组中,添加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']),
            );
        });
      }
    },
  )

);
}
}

1 个答案:

答案 0 :(得分:0)

您正在尝试在解决该问题之前访问该值。

尝试添加此行:

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

您的将来会解析为DocumentSnapshot的列表,因此只需等待将来解决,您就可以访问所有数据。另外,您可以尝试在else语句中访问此状态,其中连接状态未处于等待状态,但是在这种情况下,您正在考虑将所有非等待状态视为成功,因此我建议使用的hasData属性AsyncSnapshot类。