我有工作代码,可以使用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']),
);
});
}
},
)
);
}
}
答案 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
类。