嗨,我的代码有问题,想看看是否有人可以帮助我。我遇到的问题是我试图从 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?
}
谢谢
答案 0 :(得分:0)
您将“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 进行异步函数调用并不是一个好主意。重新考虑代码的结构。