//
// ListView.swift
// ToDoList
//
// Created by Garrett Post on 12/23/23.
//
import SwiftUI
import FirebaseFirestoreSwift
struct ListView: View {
@StateObject var viewModel = ListVM()
@FirestoreQuery var items: [Item]
init(userId: String) {
self._items = FirestoreQuery(collectionPath: "/users/\(userId)/items")
print(items)
}
var body: some View {
NavigationStack {
ZStack {
Colors.PRIMARY
.ignoresSafeArea()
VStack {
HStack {
Text("Title")
.padding()
.foregroundStyle(Colors.WHITE)
.font(.title)
Spacer()
Button {
viewModel.showingNewItemView = true
} label: {
Label("", systemImage: "plus")
.padding()
.foregroundStyle(Colors.WHITE)
.controlSize(.extraLarge)
}
}
Spacer()
List(items) { item in
Text(item.title)
}
}
}
.sheet(isPresented: $viewModel.showingNewItemView, content: {
NewItemView(showingNewItemView: $viewModel.showingNewItemView)
})
}
}
}
#Preview {
ListView(userId: "OWD1UmcgSqMDLHwZIlqlVrxoYsn1")
}
我期望 Firebase 返回 Item 对象,我知道它有一个 title 属性。我还知道 items 集合包含 Item 对象。我对使用 Firebase 还很陌生,但我假设由于身份验证功能有效,问题一定出在这个文件中。
我没有尝试过很多,因为我不知道问题是什么。 init 中的 print 语句打印一个空数组。
FirestoreQuery
没有最简单形式的错误处理
@FirestoreQuery var items: [Item]
你可以使用
@FirestoreQuery var result: Result<[Item], Error>
你的
body
需要一个switch
var body: some View {
switch result {
case .success(let items):
Text(items.count, format: .number)
case .failure(let error):
Text(error.localizedDescription)
.task {
print(error)
}
}
}
经常有一些元素缺少未标记为
Optional
的字段,这将帮助您获得更好的错误。