ios - 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)
}
}
}
}
解决方案
在 SwiftUI 中有一个专用的包装器来观察 UserDefaults。正如您之前在评论中提到的那样,它被称为@AppStorage
并且它是这样使用的。
@AppStorage("userOnboarded") var userOnboarded: Bool = false
它的功能与 UserDefault 类似,但会在值更改时刷新视图并设置数据。
Button(action: {
userOnboarded = true
print(UserDefaults.standard.bool(forKey: "userOnboarded"))
}) //....
请注意,在按钮中,我们将 userOnboarded 设置为 true,这将更新和刷新您的视图以及更新用户默认值。
推荐阅读
- reactjs - 生产模式风格的组件缩小导致类型错误
- python - Flask 返回重复列表
- r - R:找出每组直线上有多少点
- javascript - 在将 js 脚本添加到 html 后,在 react.js App 中它不起作用
- opengl - 计算着色器中与体素世界的粒子碰撞
- visual-studio - 即使 check_ipo_supported() 在 CMake 中工作,也未设置 INTERPROCEDURAL_OPTIMIZATION
- arrays - 为什么 val 不影响 KOTLIN 中的数组?
- java - 如何通过文本查找元素,忽略使用 Selenium 和 Xpath 的大小写
- r - 根据其他数据表列替换列的值
- splunk - 在 Splunk 中划分两个时间表