从 firestore 获取 doc

Posted

技术标签:

【中文标题】从 firestore 获取 doc【英文标题】:Geting doc from the firestore 【发布时间】:2021-07-19 02:35:11 【问题描述】:

您好,我的代码有问题,想看看是否有人可以帮助我。我遇到的问题是我试图从 Firestore 的用户集合中获取用户,这是因为要显示用户的个人资料,我需要用户文档。

在这里,您可以看到我是如何获取文档的,直到一切正常,然后我输入它,当我单击按钮时,它会打印 user.username (userDoc.username)。当我按下按钮时,如果它在控制台中为我提供了正确的用户名,但是当我尝试将用户(userDoc)传递给我的 profileView 时,我得到一个错误。它告诉我它找不到 userDoc。

为什么?

 Button(action: 
                                showProfilePost.toggle()
                                let docRef = Firestore.firestore().collection("users").document(viewModel.post.ownerUid)

                                docRef.getDocument  snapshot, _ in
                                  // let userDoc = snapshot?.data(as: User.self)
                                   guard let userDoc = try? snapshot?.data(as: User.self) else  return 
                                    // let userDoc = try? snapshot?.data(as: User.self)
                                    
                                   // let userDoc = snapshot!.data(as: User.self)
                                    
                                   // dataToDisplay = userDoc
                                    print("\(userDoc.username)")
                                
                                
                            , label: 

                                Text("by  \(viewModel.post.ownerUsername)")


                            ).sheet(isPresented: $showProfilePost, content: 
                                    ProfileView(user: userDoc)
                                
                              //  Text(dataToDisplay.username)
                                
                            )

在这里你可以看到我正在尝试获取的文档:

用户结构:

struct User: Identifiable, Decodable 
let username: String
 @DocumentID var id: String?

谢谢

【问题讨论】:

【参考方案1】:

您将“userDoc”声明为局部变量,这将无法在其范围之外访问。 您已经在尝试使用“dataToDisplay”。使用它,并触发 当你有数据时,表格是这样的:

Button(action: 
    let docRef = Firestore.firestore().collection("users").document(viewModel.post.ownerUid)
    
    docRef.getDocument  snapshot, _ in
        // let userDoc = snapshot?.data(as: User.self)
        guard let userDoc = try? snapshot?.data(as: User.self) else  return  // <-- local var
        // let userDoc = try? snapshot?.data(as: User.self)
        // let userDoc = snapshot!.data(as: User.self)
        dataToDisplay = userDoc  // <--- here
        print("\(userDoc.username)")
        self.showProfilePost.toggle()  // <--- trigger here
    
    
, label: 
    Text("by  \(viewModel.post.ownerUsername)")
)
    .sheet(isPresented: $showProfilePost, content: 
    ProfileView(user: dataToDisplay)  // <--- here, not userDoc
    
    //  Text(dataToDisplay.username)
)

话虽如此,但在 Button 内对 Firestore 进行异步函数调用并不是一个好主意。重新考虑代码的结构。

【讨论】:

您好,感谢您的回复。这是我的 dataToDisplay 变量:@State var dataToDisplay: User 但我删除了它,因为现在在所有视图中它都需要它,而我只在这个视图中需要它。你好吗

以上是关于从 firestore 获取 doc的主要内容,如果未能解决你的问题,请参考以下文章

Flutter web无法从firestore获取数据

从获取的文档中获取文档引用 (Firestore)

Firestore - 从文档中获取特定字段

渲染从 firebase firestore 获取的数组数据

如何从firestore获取当前用户数据?

从 firestore 获取 doc