【问题标题】:@FirestoreQuery is not returning any information@FirestoreQuery 没有返回任何信息
【发布时间】:2023-01-25 03:56:19
【问题描述】:

我正在尝试使用 @FirestoreQuery 通过 SwiftUI 应用程序获取 Firestore 文档。但是,由于某种原因,它根本不起作用。在 onAppear 中使用 SnapshotListener 和 FetchData 时,同样的功能起作用,因此它与 Firebase 规则等无关。包依赖性取决于下一个主要。请尝试重现此问题,因为 Firebase 中似乎存在某些问题以防止出现这种情况。也可能该服务是作为 Beta 提供的,但最好有一个解释。在我这边,我附上了我拥有的所有代码,这是非常基本的。

非工作的(使用@FirestoreQuery)

import SwiftUI
import Firebase
import FirebaseAuth
import FirebaseFirestore
import FirebaseFirestoreSwift

struct ContentView: View {
    @FirestoreQuery(collectionPath: "todos") var todos: [Todo]

    var body: some View {
        List(self.todos) { todo in
            Text(todo.title)
                .foregroundColor(Color.white)
        }
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Todo : Identifiable, Decodable {
    var id = UUID()
    var title: String
    var done: Bool
}

工作一个(SnapshotListener)



import SwiftUI
import Firebase
import FirebaseAuth
import FirebaseFirestore
import FirebaseFirestoreSwift

struct ContentView: View {
    @ObservedObject var todos = getTodosData()
    var body: some View {
        List(self.todos.datas) { todo in
            Text(todo.title)
                .foregroundColor(Color.white)
        }
        .onAppear{
            self.todos.retrieveData()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Todo : Identifiable, Decodable {
    var id = UUID()
    var title: String
    var done: Bool
}

class getTodosData : ObservableObject{
    @Published var datas = [Todo]()
    private var db = Firestore.firestore()
    
    func retrieveData(){
        db.collection("todos").addSnapshotListener{ (querySnapshot, error) in
            guard let mov = querySnapshot?.documents else{
                print("No todo")
                return
            }
            
            self.datas = mov.map{(queryDocumentSnapshot) -> Todo in
                let data = queryDocumentSnapshot.data()
                let id = UUID()
                let title = data["title"] as? String ?? ""
                let done = data["done"] as? Bool ?? false
                
                return Todo(id: id, title: title, done: done)
            }
        }
    }
}


【问题讨论】:

    标签: firebase google-cloud-firestore swiftui


    【解决方案1】:

    也许有点晚了,但在为此苦苦挣扎了太久之后,我终于找到了解决方案。所以,我想我应该把它分享给任何可能需要它的人。

    在 Todo 结构中,您使用 var 声明变量,但 @FirestoreQuery 包装器要求使用 let 声明变量。

    struct Todo : Identifiable, Decodable {
    let id = UUID()
    let title: String
    let done: Bool
    }
    

    【讨论】:

      【解决方案2】:

      利用 @DocumentID var id:字符串? 而不是“varlet id = UUID()”然后你可以在你的结构中使用var

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 2017-12-12
        • 2021-03-24
        • 2017-05-18
        • 1970-01-01
        相关资源
        最近更新 更多