SwiftUI:@AppStorage修改应用accent color无法即时生效的问题咨询
解决SwiftUI中Accent Color即时更新的问题
你当前的问题是:用户选择颜色后,应用全局的accentColor只有重启才会生效,无法即时变更。核心原因是PocketIslamApp结构体没有监听ColorStorage的状态变化,导致accentColor不会随someColor的更新而重新计算。
修改方案
只需要在PocketIslamApp中用@StateObject来持有ColorStorage实例,这样当someColor变化时,App的body会自动刷新,从而即时应用新的accentColor。
修改后的完整代码:
import SwiftUI class ColorStorage: ObservableObject { @AppStorage("someColor") var someColor: Color = .blue } @main struct PocketIslamApp: App { // 使用@StateObject监听ObservableObject的状态变化 @StateObject private var selectedColor = ColorStorage() var body: some Scene { WindowGroup { TesterView() .environmentObject(selectedColor) .accentColor(selectedColor.someColor) } } } struct TesterView: View { var body: some View { NavigationView { NavigationLink(destination: TesterView2()) { Text("Click Me") } } } } struct TesterView2: View { @EnvironmentObject var selectedColor: ColorStorage var body: some View { ColorPicker("Pick a Color", selection: $selectedColor.someColor) } }
原理说明
@StateObject是SwiftUI中用于在App或View层级持有ObservableObject实例的属性包装器,它会自动监听对象的状态变化。- 当
ColorStorage中的someColor(绑定到@AppStorage)被修改时,ObservableObject会自动发送状态变更通知,触发PocketIslamApp的body重新渲染,此时accentColor会使用最新的颜色值。 - 这样无需重启应用,选择颜色后全局的
accentColor会立即更新,包括导航链接、按钮等所有使用系统强调色的控件。
内容的提问来源于stack exchange,提问作者MohAliBou
相关产品推荐
相关产品推荐

