簡體   English   中英

StateObject 在 Appear 上沒有改變,但在 Button Tap 上改變了值

[英]StateObject does not change on Appear but changes value on Button Tap

單擊 BillContributorView.swift 中的按鈕時,視圖會更新,但不會出現。 我曾嘗試將 StateObject 與 ObservedObject 交換,但它不僅沒有幫助,而且我讀到我們應該用 StateObject 實例化我們的 ObservableObject。

BillContributorView.swift

 @StateObject var billManager = BillManager()
var body: some View {
        VStack {
            HStack {

            Text("Get: \(String(format: "%.2f", billManager.toGetAmount))")
                .font(.footnote)
            
            Button {
                billManager.updateToGet(contributorID: memberID)
            } label: { Text("To Get") } 
           
        }
        .onAppear(perform: {
            billManager.updateRoomID(name: roomID)
            billManager.updateToGet(contributorID: memberID )
        })

    }

賬單管理器

class BillManager: ObservableObject {

    @Published var roomID: String

    @Published var toGetbills = [Bill]()
    @Published var toGetAmount: Double = 0

    
    init(name: String? = nil) {
        if let name = name {
            roomID = name
        } else {
            roomID = ""
        }
    }
    
    func updateRoomID(name: String) {
        roomID = name
    }
 
    func updateToGet(contributorID: String) {
        let collectionName = "\(roomID)_BILLS"
        toGetAmount = 0
        
        db.collection(collectionName)
            .whereField("payer", isEqualTo: Auth.auth().currentUser?.uid ?? "")
            .whereField("contributor", isEqualTo: contributorID)
            .addSnapshotListener { snapshot, error in
               
                DispatchQueue.main.async {
                    
                    guard let doc = snapshot?.documents else {
                        print("No Doc Found")
                        return
                    }
                    
                    self.toGetbills = doc.compactMap { queryDocumentSnapshot -> Bill? in
                        let result = Result { try queryDocumentSnapshot.data(as: Bill.self) }
                        
                        switch result {
                        case .success(let bill):
                            return bill

                        }
                    }
                }
            }
        
        toGetAmount = 0
        for bill in toGetbills {
            toGetAmount += bill.itemPrice
        }
    }

通過更新閉包內的值修復了該問題。

db.collection(collectionName)
            .whereField("payer", isEqualTo: Auth.auth().currentUser?.uid ?? "")
            .whereField("contributor", isEqualTo: contributorID)
            .addSnapshotListener { snapshot, error in
                
                self.toGetAmount = 0
                    
                    guard let doc = snapshot?.documents else {
                        print("No Doc Found")
                        return
                    }
                    
                DispatchQueue.main.async {
                    self.toGetbills = doc.compactMap { queryDocumentSnapshot -> Bill? in
                        let result = Result { try queryDocumentSnapshot.data(as: Bill.self) }
                        
                        switch result {
                        case .success(let bill):
                            self.toGetAmount += bill.itemPrice
                            return bill
                            
                        case .failure( _):
                            print("Failure To Get Bill Request")
                            return nil
                        }
                        
                    }
                }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM