Доступ к значению среды без объявления свойства @Environment в представлении SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Доступ к значению среды без объявления свойства @Environment в представлении SwiftUI

Сообщение Anonymous »

Я пытаюсь получить доступ к значению своей пользовательской среды без объявления свойства @Environment в представлении. Так зачем мне это нужно?
Давайте рассмотрим пример. У меня есть собственное значение среды:

Код: Выделить всё

enum Theme {
case black
case white

func color() -> Color {
// ... Get color functional
}
}

struct ThemeKey: EnvironmentKey {
static let defaultValue: Theme = .black
}

extension EnvironmentValues {
var theme: Theme {
get { self[ThemeKey.self] }
set { self[ThemeKey.self] = newValue }
}
}
Чтобы использовать его, мне нужно написать свойство @Environment в моем представлении, вот так:

Код: Выделить всё

struct AppView: View {
var body: some View {
ContentView()
.environment(\.theme, .white)
}
}
}

struct ContentView: View {
@Environment (\.theme) private var theme

var body: some View {
Rectangle()
.fill(theme.color())
}
}
А что, если я хочу получить доступ к значению среды темы во всех моих представлениях? Например, я мог бы написать расширение для View, которое получает тему следующим образом:

Код: Выделить всё

extension View {
var theme: Theme {
return Environment(\.theme).wrappedValue
}
}

struct ContentView: View {
var body: some View {
Rectangle()
.fill(theme.color())
}
}
Но это не работает, и Xcode показывает мне ошибку при доступе к значению Environment вне установки в представлении. Он всегда будет читать значение по умолчанию и не будет обновляться.
Поэтому мой вопрос: нужно ли мне добавлять свойство @Environment в мое представление для доступа к теме< /code> или можно сделать это другим способом, например, не объявляя свойство @Environment?

Подробнее здесь: https://stackoverflow.com/questions/782 ... swiftuis-v
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»