Хотя в большинстве случаев это работает нормально, каким-то образом это приводит к сбою mysterios глубоко внутри внутреннего кода SwiftUI. Сбой не происходит внутри моего кода, и Xcode не показывает значимой трассировки стека.
Сбой происходит только при использовании значения среды внутри модификатора (см. демонстрационный код ниже). Использование @Environment(\.appTheme) непосредственно внутри представлений работает отлично.
Тема не изменяется динамически и представляет собой простую структуру. Мне нужны только глобально доступные определения стилей.
Итак, вопрос в следующем: Есть ли что-то принципиально неправильное в использовании пользовательской темы через @Environment внутри ViewModifier?
Я не могу сказать:
- моя общая архитектура темы ошибочна,
- Я случайно запускаю какое-то ограничение SwiftUI в отношении среды внутри модификаторы,
- или это ошибка SwiftUI.
Прежде чем пытаться все перепроектировать, я хочу знать, должен ли этот шаблон работать или есть ли у SwiftUI здесь известное ограничение.
Будем рады любой информации.
Код:
// Abstract AppTheme build on tokens
struct AppThemeTextTokens {
var primary: Color
var font: Font
}
struct AppTheme {
var text: AppThemeTextTokens
//...
static let `default` = AppTheme(...)
}
// Concrete, app specifix app theme
extension AppTheme {
static let theme = AppTheme(
text: .init(primary: .primary, font: .largeTitle)
)
//...
}
// App Theme EnvironmentKey
private struct AppThemeKey: EnvironmentKey {
static var defaultValue: AppTheme = AppTheme.default
}
extension EnvironmentValues {
var appTheme: AppTheme {
get { self[AppThemeKey.self] }
set { self[AppThemeKey.self] = newValue }
}
}
// Modifier to apply theme to Text views
struct AppThemeTextModifier: ViewModifier {
let theme: AppTheme?
@Environment(\.appTheme) private var envTheme // some View {
let theme = theme ?? envTheme //
Подробнее здесь: https://stackoverflow.com/questions/798 ... -is-my-the
Мобильная версия