Flutter 中的 Firestore returns 空列表
Firestore returns empty list in Flutter
我在从 firestore.I 获取数据时遇到问题可以看到 firestore 中存在所有文档 collection.But 它 returns 流生成器中的空列表。这是我的代码:
// Chat Screen.Dart
class ChatScreen extends StatefulWidget {
static final routeName = "/chat";
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Inbox"),),
body: FutureBuilder<String>(
future: DatabaseService.instance.getUserId(),
builder: (context, idSnap) {
if (idSnap.connectionState == ConnectionState.done) {
print("id snap :${idSnap.data}");
return StreamBuilder<QuerySnapshot>(
stream: DatabaseService.instance.chatListStream(idSnap.data),
builder: (context, chatsSnap) {
if (chatsSnap.connectionState == ConnectionState.waiting) {
return Text("waiting for the data");
} else if (chatsSnap.hasError) {
return Text('error ${chatsSnap.error}');
} else {
print("has data");
print("document found: ${chatsSnap.data.docs.length}"); // it prints 0
return Text("data is loaded");
}
});
} else {
return Container();
}
}
),
);
}
// DatabaseService.dart
class DatabaseService{
DatabaseService._privateConstructor();
static final DatabaseService instance = DatabaseService._privateConstructor();
FirebaseFirestore firestore = FirebaseFirestore.instance;
Future<String>getUserId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String userId = prefs.getString('user_id') ?? '0';
return userId;
}
Stream<QuerySnapshot>chatListStream(String userId){
return firestore.collection('users').doc(userId).collection('chatList').snapshots();
}
}
我已经检查了 collection 和正确的文档标题,并且传递的 userId 不为空且有效 data.Here 是 firestore 数据库的屏幕截图:
我做错了什么?
查看 chatList
子集合中的文档如何以 italic 字体显示:这意味着,在控制台中,这些文档仅作为一个或多个子集合的“容器”(或“占位符”)存在,但它们不是“真正的”文档,即它们不存在于 Firestore 数据库中。 因此,在其中一个 chatList
子集合中查询文档将 return 一个空的 QuerySnapshot。
您可能直接在这些 chatList
个文档的子集合下创建了文档,而没有创建 chatList
个文档。
因此,在您的情况下,如果您需要在 chatList
集合中拥有真正的文档,则需要在创建第一个子集合文档的同时创建它们。
另外,请注意 Cloud Firestore 具有浅读取:查询集合中的文档不会从子集合中提取数据。
我在从 firestore.I 获取数据时遇到问题可以看到 firestore 中存在所有文档 collection.But 它 returns 流生成器中的空列表。这是我的代码:
// Chat Screen.Dart
class ChatScreen extends StatefulWidget {
static final routeName = "/chat";
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Inbox"),),
body: FutureBuilder<String>(
future: DatabaseService.instance.getUserId(),
builder: (context, idSnap) {
if (idSnap.connectionState == ConnectionState.done) {
print("id snap :${idSnap.data}");
return StreamBuilder<QuerySnapshot>(
stream: DatabaseService.instance.chatListStream(idSnap.data),
builder: (context, chatsSnap) {
if (chatsSnap.connectionState == ConnectionState.waiting) {
return Text("waiting for the data");
} else if (chatsSnap.hasError) {
return Text('error ${chatsSnap.error}');
} else {
print("has data");
print("document found: ${chatsSnap.data.docs.length}"); // it prints 0
return Text("data is loaded");
}
});
} else {
return Container();
}
}
),
);
}
// DatabaseService.dart
class DatabaseService{
DatabaseService._privateConstructor();
static final DatabaseService instance = DatabaseService._privateConstructor();
FirebaseFirestore firestore = FirebaseFirestore.instance;
Future<String>getUserId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String userId = prefs.getString('user_id') ?? '0';
return userId;
}
Stream<QuerySnapshot>chatListStream(String userId){
return firestore.collection('users').doc(userId).collection('chatList').snapshots();
}
}
我已经检查了 collection 和正确的文档标题,并且传递的 userId 不为空且有效 data.Here 是 firestore 数据库的屏幕截图:
我做错了什么?
查看 chatList
子集合中的文档如何以 italic 字体显示:这意味着,在控制台中,这些文档仅作为一个或多个子集合的“容器”(或“占位符”)存在,但它们不是“真正的”文档,即它们不存在于 Firestore 数据库中。 因此,在其中一个 chatList
子集合中查询文档将 return 一个空的 QuerySnapshot。
您可能直接在这些 chatList
个文档的子集合下创建了文档,而没有创建 chatList
个文档。
因此,在您的情况下,如果您需要在 chatList
集合中拥有真正的文档,则需要在创建第一个子集合文档的同时创建它们。
另外,请注意 Cloud Firestore 具有浅读取:查询集合中的文档不会从子集合中提取数据。