我正在尝试在视图中获取“使用 colorScheme”环境值,并根据 colorScheme,为颜色使用不同的主题模型
@Environment(\.colorScheme) private var colorScheme
self.themeModel.setTheme(colorScheme == .light ? LightTheme() : DarkTheme())
但我收到警告 访问安装在视图之外的环境的值。这将始终读取默认值并且不会更新。 并且总是看到 colorScheme = .light
我该怎么做?
@Environment 属性只能在
View
、ViewModifier
和确认 DynamicProperty
声明的属性包装器内声明。
根据我的经验,即使尝试读取
View.body
内的环境属性也没有完全按预期工作。
您有两个选择:
最简单的:
UITraitCollection.current
视图,请使用 UIKit
获取当前配色方案;或更“SwiftUI-y”:
ObservableObject
,并添加您的ColorScheme
属性,并用@Published
注释:final class MyObject: ObservableObject {
@Published var colorScheme: ColorScheme
}
在您看来,将环境值“出现”分配给您的对象,以便可以在
SwiftUI.View
之外使用它:
struct MyView: View {
@Environment(\.colorScheme) var colorScheme
@ObservedObject var myObject: MyObject // must be passed via init
var body: some View {
myViewBody
.onAppear {
myObject.colorScheme = colorScheme
}
}
}
事实上,如果您不打算在视图中使用
ObservableObject
,您甚至可能不需要 @Published
/@ObservedObject
/MyObject
。