SwiftUI的基于状态的视图切换没有生效
我一定漏掉了什么明显的地方。当 @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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。