繁体   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