如何解决@EnvironmentObject中的@Published属性不会更新应用程序的根视图 应该如何工作
我正在尝试使用@EnvironmentObject为我的应用程序创建路由器对象。但是问题在于,更新根视图类型时,@ Published属性不会更新根视图。
应该如何工作
- 用户单击使用Apple登录按钮
- 当用户成功登录时,更新@EnvironmentObject的router.currentPage属性。
- RootView收到有关更新router.currentPage的通知,并根据更新的currentPage类型更改根视图。
这是我的下面的代码。
MainApp.swift
var body: some Scene {
WindowGroup {
RootView().environmentObject(ViewRouter())
}
}
ViewRouter.swift
Code Block
enum Page {
case signin
case tasklist
}
final class ViewRouter: ObservableObject {
@Published var currentPage: Page = .signin
}
RootView.swift
struct RootView: View {
@EnvironmentObject var router: ViewRouter
var body: some View {
if router.currentPage == .signin {
SigninView()
} else {
TaskListView()
}
}
}
SigninView.swift
struct SigninView: View {
@EnvironmentObject var router: ViewRouter
@State var signInHandler: SignInWithAppleCoordinator?
var window: UIWindow? {
guard let scene = UIApplication.shared.connectedScenes.first,let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate,let window = windowSceneDelegate.window else {
return nil
}
return window
}
var body: some View {
MyAppleIDButton().colorScheme(.light)
.frame(width: 280,height: 38,alignment: .center)
.onTapGesture {
signInWithAppleButtonTapped()
}
}
func signInWithAppleButtonTapped() {
guard let _window = self.window else { return }
signInHandler = SignInWithAppleCoordinator(window: _window)
signInHandler?.signIn { (user) in
router.currentPage = .tasklist
}
}
}
更新
我想我找到了这个问题的答案。
我创建了一个状态isLoggedIn
,用于检查Sign in with Apple
是否成功完成。
@State var isLoggedIn: Bool = false
然后我添加了 View Modifier onChange
,它正在检查上面isLoggedIn的值更改。在onChange
内部,我为router.currentPage
分配了一个新值,如下所示。
.onChange(of: isLoggedIn,perform: { isLoggedIn in
if isLoggedIn {
router.currentPage = .tasklist
} else {
router.currentPage = .signin
}
})
但是我仍然不确定为什么在SigninWithApple按钮的关闭中不起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。