Использование @Environment внутри ViewModifier приводит к глубокому сбою SwiftUI — является ли моя настройка темы принциIOS

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

Сообщение Anonymous »

Я использую собственный тип AppTheme и внедряю его через собственный EnvironmentKey. Представления могут получить доступ к теме с помощью @Environment(\.appTheme) или явно переопределить ее.
Хотя в большинстве случаев это работает нормально, каким-то образом это приводит к сбою 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
Ответить

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

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

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

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

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