Я пытаюсь получить значение среды Use colorScheme в представлении и на основе colorScheme использовать другую модель темы для цветов.
@Environment(\.colorScheme) private var colorScheme
self.themeModel.setTheme(colorScheme == .light ? LightTheme() : DarkTheme())
Но я получаю предупреждение Доступ к значению среды вне установки в представлении. Это всегда будет читать значение по умолчанию и не будет обновляться. И всегда смотрите colorScheme = .light
Как я могу это сделать?
Как я уже сказал в вопросе, я пытаюсь получить эту цветовую схему в представлении.
Где в представлении? Покажите, пожалуйста, минимально воспроизводимый пример .
@Environment
свойства могут быть объявлены только:
View
;ViewModifier
и *Style
; иDynamicProperty
.По моему опыту, даже попытка прочитать свойства среды внутри
View.body
не сработала должным образом.
У вас есть два варианта:
UITraitCollection.current
, чтобы получить текущую цветовую схему, если вместо этого вы имеете дело с представлениями UIKit
; ИЛИ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
внутри своего представления.
Куда вы поместили две показанные вами строки кода?