登录成功后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
相关产品推荐
相关产品推荐

