Swift 5.1 组合可观察/环境变量在 didSet 时未更新

标签 swift swift5

我试图找出为什么我的session没有更新,尽管didSet触发并可能更新User

我已经从代码片段中删除了多余的注释和样式,但这就是我目前正在尝试的。

//  SessionStore.swift

class User {
    var uid: String
    var phoneNumber: String
    init(uid: String, phoneNumber: String) {
        self.uid = uid
        self.phoneNumber = phoneNumber
    }

}
class SessionStore : ObservableObject {
    var didChange = PassthroughSubject<SessionStore, Never>()
    var session: User? { didSet { self.didChange.send(self); print("didSet()") }}
    var handle: AuthStateDidChangeListenerHandle?
    func listen () {
        // monitor authentication changes using firebase
        handle = Auth.auth().addStateDidChangeListener { (auth, user) in
            if let user = user {
                self.session = User(
                    uid: user.uid,
                    phoneNumber: ""
                )
            } else {
                self.session = nil
            }
        }
    }
    func register(
        phoneNumber: String,
        handler: @escaping AuthDataResultCallback
        ){

        PhoneAuthProvider.provider(auth: Auth.auth())
        PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
          if let error = error {
            return
          }
            UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
            let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
            let verificationCode = "123456"
            let credential = PhoneAuthProvider.provider().credential(
                withVerificationID: verificationID!,
                verificationCode: verificationCode
            )
            Auth.auth().signIn(with: credential) { (authResult, error) in
                if let error = error {
                    print(error)
                    return
                }
                self.listen()
                return
            }

        }
    }
}

struct Login: View {
    @EnvironmentObject var session: SessionStore
    @State var phoneNumber: String = ""
    @State var loading = false
    @State var error = false
    func getUser () {
        session.listen()
    }
    var body: some View {
        Group {
            // If  the user is logged in
            if(session.session != nil) {
                Score()
            // If the user is NOT logged in
            } else {
                VStack {
                    Text("Register!")
                    TextField("Phone Number", text: $phoneNumber)
                    MyButton(...).gesture(TapGesture().onEnded {
                        self.session.register(
                            phoneNumber: self.phoneNumber
                         ){
                             (result, error) in
                             if(error != nil) {
                                 self.error = true
                             } else {
                                 self.phoneNumber = ""
                                 self.getUser()
                             }
                         })
                    }
                }
            }
        }.onAppear(perform: getUser)
    }
}

最佳答案

Scratchy(仅基于您的快照)...

而不是这个

class SessionStore : ObservableObject {
    var didChange = PassthroughSubject<SessionStore, Never>()
    var session: User? { didSet { self.didChange.send(self); print("didSet()") }}

用这个

class SessionStore : ObservableObject {
    @Published var session: User?

据我从快照中看到,不需要更多的更改,可能是其他部分中的某种类型对齐。

关于Swift 5.1 组合可观察/环境变量在 didSet 时未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59445905/

相关文章:

ios - 在 iOS 中设置时区的正确格式是什么?

ios - 如何将汉堡包图标添加到 UICollectionViewCell 的右侧

ios - 极坐标点生成函数上界不是2Pi for theta吗?

nslayoutconstraint - 在iOS中以编程方式设置约束使按钮消失

ios - uitableviewcell 内的 Collection View 单元格中的图像不带圆角

ios - 如何在 SwiftUI 的列表中设置和使用参数 "selection"

ios - 编写扩展文件属性 swift 示例

swift - 以编程方式快速使 SKLabelNode 变为粗体

swift - 实例化的可选变量在 Xcode 调试器中显示为 nil

swift - 当主类的父类(super class)是 UICollectionViewCell 时,如何执行Segue或从单元格转到另一个 View