SwiftUI中UserDefaults调用set后@State变量未同步更新如何解决
问题原因
@State 仅会在视图初始化时读取一次初始值,本身不具备监听 UserDefaults 数据变更的能力,所以你修改 UserDefaults 后,@State 变量不会自动更新,只能手动同步值。
规范解决方案
直接使用 SwiftUI 原生提供的 @AppStorage 属性包装器替换 @State 即可。它是 Apple 专门为绑定 UserDefaults 存储设计的属性包装器,会自动监听对应键值的变更,同时触发视图刷新,不需要你手动维护两边的数值同步。
修改后代码如下:
// 直接绑定UserDefaults中key为userOnboarded的数值,初始值为false @AppStorage("userOnboarded") var userOnboarded: Bool = false var body: some Scene { WindowGroup { if userOnboarded { Text("PLACEHOLDER: Main App View") } else { Button(action: { // 直接修改该变量就会自动同步写入UserDefaults,同时触发视图切换到主界面 userOnboarded = true print(UserDefaults.standard.bool(forKey: "userOnboarded")) }) { VStack { Text("Click circle to onboard.") Circle() .foregroundColor(Color.red) } } } } }
补充说明
@AppStorage底层完全基于 UserDefaults 实现,修改属性值会自动写入 UserDefaults,UserDefaults 对应键值被其他逻辑修改时,@AppStorage也会自动更新属性值并触发视图重绘。- 如果你的应用需要兼容 iOS 14 以下的系统版本,可以手动监听
NSUserDefaultsDidChangeNotification通知,收到通知后更新@State变量的值即可。目前绝大多数应用最低兼容版本都已达到 iOS 14,优先使用@AppStorage是最简单高效的方案。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

