@FirestoreQuery is not returning any information

Viewed 58

I'm trying to use @FirestoreQuery to fetch Firestore documents using SwiftUI app. However, for some reason it is not working at all. The same functionality works when using SnapshotListener and FetchData inside onAppear, so it is not associated with Firebase rules etc. The package dependency is up to next major. Please try to reproduce this as it seems something is broken within Firebase to prevent this. It may also be that the service is offered as Beta, but an explanation would be nice. On my end, I've attached all of the code I have, which is very basic.

Non-working one (using @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
}

Working one (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)
            }
        }
    }
}


0 Answers
Related