首页 > 解决方案 > 从 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)
        }

    }
}

但我得到了这个 错误

标签: google-cloud-firestoreswiftui

解决方案


推荐阅读