Используйте значение среды colorScheme для использования в классе модели

Я пытаюсь получить значение среды Use colorScheme в представлении и на основе colorScheme использовать другую модель темы для цветов.

@Environment(\.colorScheme) private var colorScheme
self.themeModel.setTheme(colorScheme == .light ? LightTheme() : DarkTheme())

Но я получаю предупреждение Доступ к значению среды вне установки в представлении. Это всегда будет читать значение по умолчанию и не будет обновляться. И всегда смотрите colorScheme = .light

Как я могу это сделать?

Куда вы поместили две показанные вами строки кода?

Sweeper 06.05.2024 06:22

Как я уже сказал в вопросе, я пытаюсь получить эту цветовую схему в представлении.

user1165756 06.05.2024 15:58

Где в представлении? Покажите, пожалуйста, минимально воспроизводимый пример .

Sweeper 06.05.2024 15:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@Environment свойства могут быть объявлены только:

  • внутри View;
  • внутренние типы, соответствующие ViewModifier и *Style; и
  • Обертки свойств, соответствующие DynamicProperty.

По моему опыту, даже попытка прочитать свойства среды внутри View.body не сработала должным образом.

У вас есть два варианта:

  • Просто:
    • Используйте UITraitCollection.current, чтобы получить текущую цветовую схему, если вместо этого вы имеете дело с представлениями UIKit; ИЛИ

  • Тем более «SwiftUI-у»:
    • Создайте отдельный класс, приведите его в соответствие с 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 внутри своего представления.

Другие вопросы по теме