【问题标题】:Firestore returns empty list in FlutterFirestore 在 Flutter 中返回空列表
【发布时间】:2021-08-12 15:10:00
【问题描述】:

我在从 firestore 获取数据时遇到问题。我可以看到 firestore 集合中存在所有文档。但它在流生成器中返回空列表。这是我的代码:

// 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();
  }
 
}

我已经检查了正确的集合和文档标题,并且传递的 userId 不是 null 和有效数据。这是 firestore 数据库的屏幕截图:

我在这里做错了什么?

【问题讨论】:

  • print("id snap :${idSnap.data}");你有一个有效的 id 吗?
  • 是的,它提供了有效的 id

标签: firebase flutter google-cloud-firestore stream-builder


【解决方案1】:

查看chatList 子集合中的文档如何以斜体 字体显示:这意味着,在控制台中,这些文档仅作为“容器”(或一个或多个子集合的“占位符”),但它们不是“真正的”文档,即它们不存在于 Firestore 数据库中。 因此,在这些 chatList 子集合之一中查询文档将返回一个空的 QuerySnapshot。

您可能直接在每个 chatList 文档的子集合下创建了文档,而没有创建 chatList 文档本身。


因此,就您而言,如果您需要在 chatList 集合中拥有真正的文档,您需要在创建第一个子集合文档的同时创建它们。

另外,请注意 Cloud Firestore 具有浅读取:查询集合中的文档不会从子集合中提取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2022-12-18
    • 2021-12-27
    • 2021-02-09
    • 2019-12-20
    • 2020-03-21
    • 2019-12-12
    相关资源
    最近更新 更多