google-cloud-firestore - 从 firebase 获取数据到 SwiftUI
问题描述
我正在学习 SwiftUI 并使用 firebase 做一个简单的应用程序。我的问题是获取数据(实时)
这是该应用程序的工作方式。我有贷款对象和付款对象。
在第一个视图(列表)中,我实时获取我所有的贷款,可以添加/删除并且它可以工作。当我点击任何贷款对象时,它会带我进入第二个视图(付款),在那里我为该贷款插入了所有付款。为了下载我的付款,我需要提供我的 LoanId,以便 Firebase 过滤我的付款并仅向我发送所选贷款的付款。问题是当我在转换中将我的loanId 传递给我的付款视图时,我不知道要这样做,因为我下载我的付款的模型在我进行loanId 的转移之前被调用。
任何建议将不胜感激。
这是我在 LoansView struct LoansView 中的代码: View {
@State private var showingAddLoan = false
@ObservedObject var dataListener = LoanListener()
var body: some View {
NavigationView {
List(dataListener.loans) { loan in
NavigationLink(destination: LoanDetailView(loan: loan)) {
ListCell(loan: loan)
}
}
.navigationBarTitle("All Loans")
.navigationBarItems(trailing:
Button(action: {
self.showingAddLoan.toggle()
}) {
Image(systemName: "plus")
})
.sheet(isPresented: self.$showingAddLoan) {
AddLoanView()
}
}
}
}
我的贷款监听器
import Foundation
import Firebase
class LoanListener: ObservableObject {
@Published var loans = [Loan]()
init() {
downloadLoans()
}
func downloadLoans() {
FirebaseReference(.User).document("1234").collection(kLOAN_PATH).addSnapshotListener { (snapshot, error) in
guard let snapshot = snapshot else { return }
if !snapshot.isEmpty {
self.loans = LoanListener.loanFromDictionaries(snapshot)
}
}
}
static func loanFromDictionaries(_ snapshot: QuerySnapshot) -> [Loan] {
var allLoans: [Loan] = []
for loanData in snapshot.documents {
allLoans.append(Loan(loanData.data() as NSDictionary))
}
return allLoans
}
}
这是我的付款监听器,但问题是我必须向它提供 loanId 才能获得正确的付款
import Foundation
import Firebase
class PaymentListener: ObservableObject {
@Published var payments = [Payment]()
init(forLoan: Loan) {
downloadPayments(forLoan)
}
func downloadPayments(_ forLoan: Loan) {
FirebaseReference(.User).document("1234").collection(kPAYMENT_PATH).whereField(kLOANID, isEqualTo: forLoan.id).addSnapshotListener { (snapshot, error) in
guard let snapshot = snapshot else { return }
print("too")
if !snapshot.isEmpty {
print("have")
self.payments = PaymentListener.paymentFromDictionaries(snapshot)
print(self.payments.count)
}
}
}
static func paymentFromDictionaries(_ snapshot: QuerySnapshot) -> [Payment] {
var allPayments: [Payment] = []
for paymentData in snapshot.documents {
allPayments.append(Payment(paymentData.data() as NSDictionary))
}
return allPayments
}
}
这是我的付款视图,我想在其中显示每笔贷款的付款
struct LoanDetailView: View {
@State var showingAddPayment = false
var loan: Loan
@ObservedObject var allPayments = PaymentListener(forLoan: loan)
var body: some View {
List(allPayments) { payment in
PaymentCell(payment: payment)
}
.navigationBarTitle("loan.name", displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
self.showingAddPayment.toggle()
}) {
Image(systemName: "plus")
})
.sheet(isPresented: self.$showingAddPayment) {
AddPaymentView(loanId: self.loan.id)
}
}
}
解决方案
推荐阅读
- mocha.js - Mocha 侧边栏 vscode 扩展不会自动刷新测试
- flutter - 如何在 GButton (google_nav_bar) 中使用自定义小部件(网络图像)?
- asp.net-core - 具有公司 AD Windows 身份验证的 Blazor wasm 托管应用程序
- python - 将多个 CSV 加载到单个 pandas 数据框中
- python - 我收到“[Errno 2] No such file or directory”错误代码,即使我有直接/绝对路径....有什么建议吗?
- python - 如何计算数字数组的对数阶乘
- c++ - lambda 中的“变量阴影”警告(未捕获时)
- python - 将 Mobilenet 模型转换为 TFLite 会更改输入大小
- hyperledger - Hyperledger Composer 无法在 Ubuntu 20.04 上运行
- flutter - Flutter:具有持久性 BottomNavigationBar 的嵌套路由,但没有不必要地构建未选择的页面