You need to enable JavaScript to run this app. 登录成功后SwiftUI视图未跳转重加载的问题如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

登录成功后SwiftUI视图未跳转重加载的问题如何解决?

问题根因

你创建了两个完全独立的LoginViewModel实例,状态没有同步:

  • ContentView中用@StateObject初始化了第一个LoginViewModel实例,用于控制全局路由切换
  • LoginView中又用@StateObject单独初始化了第二个LoginViewModel实例,登录逻辑修改的是这个实例的状态
    二者完全隔离,所以LoginViewModel内部的状态更新无法触发ContentView的路由切换。

解决方案

1. 修改LoginView的ViewModel声明

将LoginView中自行创建LoginViewModel的逻辑删掉,改为接收外部传入的实例:

struct LoginView: View {
    // 改为接收外部传入的ViewModel,不要自行初始化
    @ObservedObject var loginVM: LoginViewModel

    // 其余原有代码保持不变
    @State var email: String = ""
    @State var password: String = ""
    @ObservedObject var keyboardResponder = KeyboardResponder()

    var body: some View {
        // 原有布局代码保持不变
    }
}

2. 给LoginView传递全局共用的ViewModel实例

修改ContentView中加载LoginView的代码,把全局的userStatus实例传入:

struct ContentView: View {
    @StateObject var userStatus = LoginViewModel()
    
    var body: some View {
        if !userStatus.isAuthenticated {
            // 传入共用的ViewModel实例
            LoginView(loginVM: userStatus)
        } else {
            ProjectsView()
        }
    }
}

优化建议

可以在LoginViewModel初始化时读取本地存储的token,实现自动登录效果:

class LoginViewModel: ObservableObject {
    var email: String = ""
    var password: String = ""
    @Published var isAuthenticated: Bool = false
    @Published var authenticationDidFail: Bool = false
    
    // 新增初始化方法,判断本地是否有有效token
    init() {
        isAuthenticated = UserDefaults.standard.string(forKey: "jsonwebtoken") != nil
    }

    // 其余原有login方法代码保持不变
}

内容的提问来源于stack exchange,提问作者John Gerard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 09:45:05