SwiftUI登录状态视图切换优化:注入对象至ViewModel及自动登出
需求目标
- 用户首次启动应用时展示LoginView
- 用户登录后存储token并跳转至HomeView
- 用户后续启动应用时,因已存储token直接进入HomeView
- 当token过期时,自动登出用户并返回登录界面
已尝试的方案
核心思路是将Authentication对象注入SwiftUI环境,实现登录状态的全局管理,具体代码如下:
定义Authentication类
class Authentication: ObservableObject { @Published var isValidated = false func updateValidation(success: Bool) { withAnimation { isValidated = success } } }
在主App中注入环境
@main struct MySecureApp_App: App { @StateObject var authentication = Authentication() var body: some Scene { WindowGroup { if authentication.isValidated { ContentView() .environmentObject(authentication) } else { HomeView() .environmentObject(authentication) } } } }
登录视图中使用环境对象
struct LoginView: View { @StateObject private var loginVM = LoginViewModel() @EnvironmentObject var authentication: Authentication var body: some View { VStack { // 登录相关UI Button("登录") { loginVM.login { success in authentication.updateValidation(success: success) } } } } }
首页视图中监听未授权状态
struct HomeView: View { @StateObject private var homeVM = HomeViewModel() @EnvironmentObject var authentication: Authentication var body: some View { NavigationView { VStack { }.onReceive(homeVM.$isUnauthorized) { isUnauthorized in if isUnauthorized { authentication.updateValidation(success: false) } } } } }
问题与疑问
- 当前方案需要在每个视图中传递
Authentication对象,操作繁琐,能否将这类StateObject或EnvironmentObject直接注入到ViewModel或服务类中? - 我认为更优的实现是在HTTPClient收到API未授权响应时直接触发登出逻辑,而非在每个视图中单独检查未授权状态,该如何实现这一逻辑?
内容的提问来源于stack exchange,提问作者Shawn Frank
相关产品推荐
相关产品推荐

