我试图找出为什么我的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/