gpt4 book ai didi

swift - 如何从 Coordinator 类更新 EnvironmentObject 变量?

转载 作者:行者123 更新时间:2023-12-04 15:25:08 26 4
gpt4 key购买 nike

当用户通过 FB 登录按钮完成授权时,我正在使用 Coordinator(符合 LoginButtonDelegate)对象来接收用户数据(配置文件、姓名)。
Coordinator().userId 属性使用用户 ID 进行更新,但我需要将其向上传递 1 级到 LoginView 并更新名为 thisSession 的 EnvironmentObject(以某种方式使 thisSession.userId = Coordinator().userId)。

有没有办法做到这一点?我尝试使用 ObservableObject/Published 属性,但我无法从 Coordinator 更新父对象的属性。

另一个想法是订阅 Auth.auth() 更改,但这似乎太复杂了,有点“老派”的解决方案。有一些我想念的简单方法。

任何提示/想法?

import SwiftUI
import FirebaseCore
import FirebaseAuth
import FBSDKLoginKit
import FBSDKCoreKit

struct LoginView: View {
@EnvironmentObject var thisSession: CurrentSession
@ObservedObject var mainData = MainViewModel()

var facebookView = facebook()

var body: some View {
VStack {
facebookView.frame(width: 240, height: 50)
Text("\(self.thisSession.userId ?? "none")")
}
}
}

struct LoginView_Previews: PreviewProvider {
static var previews: some View {
LoginView().environmentObject(CurrentSession())
}
}


struct facebook: UIViewRepresentable {
@EnvironmentObject var thisSession: CurrentSession
@ObservedObject var coordinator = Coordinator()

func makeCoordinator() -> facebook.Coordinator {
return self.coordinator
//facebook.Coordinator()
}

func makeUIView(context: UIViewRepresentableContext<facebook>) -> FBLoginButton {

let button = FBLoginButton()
button.delegate = self.coordinator
print("UPDATED")

return button
}

func updateUIView(_ uiView: FBLoginButton, context: UIViewRepresentableContext<facebook>) {
}

class Coordinator: NSObject, LoginButtonDelegate, ObservableObject {
@Published var userId: String?
func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {

if error != nil{

print((error?.localizedDescription)!)
return
}
if AccessToken.current != nil{

let credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)

Auth.auth().signIn(with: credential) { (res,er) in

if er != nil{
print((er?.localizedDescription)!)
return

}
print("email: \(String(describing: res?.user.email))")
print("name: \(String(describing: res?.user.displayName))")
self.userId = String(describing: res?.user.displayName)
}
}
}

func loginButtonDidLogOut(_ loginButton: FBLoginButton) {
print("logged out")
try! Auth.auth().signOut()

}
}

}

最佳答案

尝试以下操作,因为在更新期间创建了协调器,环境对象应该已经被注入(inject)并存在,所以它应该可以工作

struct facebook: UIViewRepresentable {
@EnvironmentObject var thisSession: CurrentSession

func makeCoordinator() -> facebook.Coordinator {
Coordinator(session: thisSession) // << here !!
}

func makeUIView(context: UIViewRepresentableContext<facebook>) -> FBLoginButton {

let button = FBLoginButton()
button.delegate = self.coordinator
print("UPDATED")

return button
}

func updateUIView(_ uiView: FBLoginButton, context: UIViewRepresentableContext<facebook>) {
}

class Coordinator: NSObject, LoginButtonDelegate, ObservableObject {
let session: CurrentSession
init(session: CurrentSession) {
self.session = session
}

func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {

if error != nil{

print((error?.localizedDescription)!)
return
}
if AccessToken.current != nil{

let credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)

Auth.auth().signIn(with: credential) { (res,er) in

if er != nil{
print((er?.localizedDescription)!)
return

}
print("email: \(String(describing: res?.user.email))")
print("name: \(String(describing: res?.user.displayName))")

DispatchQueue.main.async { // << here
self.session.userId = String(describing: res?.user.displayName)
}
}
}
}

func loginButtonDidLogOut(_ loginButton: FBLoginButton) {
print("logged out")
try! Auth.auth().signOut()

}
}

}

关于swift - 如何从 Coordinator 类更新 EnvironmentObject 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62437431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com