1

我正在尝试使用@EnvironmentObject 为我的应用程序创建一个路由器对象。但问题是更新根视图类型时,@Published 属性不会更新根视图。

它应该如何工作

  1. 用户单击“使用 Apple 登录”按钮
  2. 当用户成功登录时,更新@EnvironmentObject 的 router.currentPage 属性。
  3. 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 按钮时不起作用。

4

0 回答 0