SwiftUI的基于状态的视图切换没有生效

移动开发 2026-07-09

我一定漏掉了什么明显的地方。当 @Observable的类属性发生变化时,@State的属性却没有变化。

@Observable class AuthService {
    var userSession : String = ""

    // later after creating a new user
    self.userSession = username

对于视图来说

struct ContentView: View {

    @State private var auth = AuthService()

    var body: some View {
        Group{
            if auth.userSession.isEmpty {
                LoginView()
            } else {
                InboxView()
            }
        }
    }
}

当用户登录或创建新用户时,userSession变量会变化,但视图不会。若我在userSession变化后立刻终止模拟器(它也通过SimpleKeychain保存)再重新启动,它就会如预期地加载InboxView。

解决方案

假设你使用的是iOS 17及以上版本,并且使用新的可观测宏,你可以尝试在父视图中创建 @state 属性,并按如下方式传递给这个子视图

let auth: AuthService // 这将仅用于读取

如果你想读写,请创建下面的属性包装器

@Bindable let auth: AuthService

另一种方案如下

class AuthService: ObservableObject {
    @Published var userSession: String = "" //This will track the changes when updates happen
}

将此替换为

 @State private var auth = AuthService()

    @StateObject private var auth = AuthService()

请注意:-(在iOS 16及更早版本 @State 仅跟踪值类型的变化)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章