stateObject不会更改出现,而是更改按钮点击的值

发布于 2025-02-13 05:18:16 字数 2340 浏览 0 评论 0原文

单击BillContributorView.Swift中存在的按钮时,视图更新但不显示。我尝试过将状态对象换成观察对象,但它不仅没有帮助,而且还读到,我们应该用stateObject实例化可观察的对象。

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 )
        })

    }

billmanager

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
        }
    }

On Clicking the Button present in BillContributorView.swift, the view updates but not on Appear. I have tried swapping StateObject with ObservedObject but not only does it not help but also, I read that we should instantiate our ObservableObject with StateObject.

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 )
        })

    }

BillManager

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
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暖阳 2025-02-20 05:18:16

修复了问题,通过更新关闭内部的值来修复问题。

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
                        }
                        
                    }
                }
            }

Fixed the issue by updating the value inside the closure.

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
                        }
                        
                    }
                }
            }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文