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 具有浅读取:查询集合中的文档不会从子集合中提取数据。