问题描述
在我的 iOS14 小部件中,我需要检测系统的明暗模式,因为基于此,我在时间轴创建过程中进行了不同的操作。
我试过了
struct WidgetProvider: IntentTimelineProvider {
@Environment(\.colorScheme) var colorScheme
func getTimeline(
for configuration: MyConfigurationIntent,in context: Context,completion: @escaping (Timeline<Entry>) -> Void
) {
//colorScheme is never equal to .dark
}
}
如果我使用 let darkMode = uitraitcollection.current.userInterfaceStyle == .dark
而不是 colorScheme
,它可以工作,但只有一次。如果我更改模式并重新加载小部件,它仍然使用旧的颜色模式。
如何正确检测模式?
解决方法
首先,@Environment
变量只能在 SwiftUI 视图中使用。您不能在 IntentTimelineProvider
中使用它们。
然后,您正确地尝试了另一种检测 colorScheme
的方法:
let darkMode = UITraitCollection.current.userInterfaceStyle == .dark
问题在于,当您更改外观时,条目(和时间线本身)不会重新生成。仅重绘视图。
最好的方法是直接在视图中使用 @Environment(\.colorScheme)
。看到这个答案:
如果您确实需要在时间线中创建颜色方案相关变量,我建议您为两种颜色方案创建它们并根据 @Environment(\.colorScheme)
在视图中有条件地显示。