首页 > 解决方案 > SwiftUI 中的状态变量未拾取 UserDefaults .set

问题描述

我正在尝试检测用户是否已登录,例如启动应用程序。当我UserDefaults.standard.bool直接访问时,我可以看到更改,但是当我尝试通过@State它访问它时,它会保留原始false值。

作为一种解决方法,我直接将值更改为true,但我觉得这不是这样做的方法。

如何@State在更改UserDefaults对象时获取变量以获取更改,而无需关闭并重新启动应用程序?我希望用户登录,单击一个按钮,然后立即切换到主应用程序视图。

@State var userOnboarded: Bool = UserDefaults.standard.bool(forKey: "userOnboarded")
    
    var body: some Scene {
        WindowGroup {
            if userOnboarded {
                Text("PLACEHOLDER: Main App View")
            } else {
                Button(action: {
                    UserDefaults.standard.set(true, forKey: "userOnboarded")
                    userOnboarded = true
                    print(UserDefaults.standard.bool(forKey: "userOnboarded"))
                }) {
                    VStack {
                        Text("Click circle to onboard.")
                        Circle()
                            .foregroundColor(Color.red)
                    }
                }
            }
        }

标签: iosswiftui

解决方案


在 SwiftUI 中有一个专用的包装器来观察 UserDefaults。正如您之前在评论中提到的那样,它被称为@AppStorage并且它是这样使用的。

@AppStorage("userOnboarded") var userOnboarded: Bool = false

它的功能与 UserDefault 类似,但会在值更改时刷新视图并设置数据。

Button(action: {
    userOnboarded = true
    print(UserDefaults.standard.bool(forKey: "userOnboarded"))
}) //....

请注意,在按钮中,我们将 userOnboarded 设置为 true,这将更新和刷新您的视图以及更新用户默认值。


推荐阅读