Сообщество RSS DEV

Когда НЕ стоит использовать '@EnvironmentObject' в SwiftUI

@EnvironmentObject — это обертка свойства SwiftUI для доступа к общим данным, соответствующим ObservableObject. Она внедряет объект в окружение, позволяя дочерним представлениям получать к нему доступ без явной передачи. Изменения опубликованных свойств в объекте вызывают повторную отрисовку в наблюдающих представлениях. Однако существенным недостатком является то, что если объект не найден в окружении, приложение завершит работу во время выполнения. Это часто происходит с многоразовыми компонентами или при тестировании представлений в изоляции. @EnvironmentObject не подходит, когда зависимость нужна только нескольким представлениям, так как явные параметры делают зависимости понятными. Для многоразовых компонентов предпочитайте явные зависимости через инициализаторы или замыкания для поддержания переносимости и тестируемости. Тестирование представлений становится значительно проще с явными зависимостями, избегая необходимости настраивать всю среду для каждого теста. Условные зависимости также неудобны с @EnvironmentObject, так как предполагается, что объект существует всегда. Передача данных в пункты назначения NavigationLink с использованием @EnvironmentObject может привести к тонким сбоям во время выполнения и тесной связи со стратегией DI. Детализированное наблюдение также вызывает беспокойство, так как любое изменение опубликованного свойства переоценивает все наблюдающие представления. Предварительные просмотры также становятся громоздкими из-за повторяющейся необходимости внедрять объекты окружения. Альтернативы включают явные параметры инициализатора, замыкания для действий, @StateObject для собственного состояния, @Observable для более эффективного наблюдения и пользовательские EnvironmentKeys со значениями по умолчанию. @EnvironmentObject остается полезным для действительно общесистемных задач, таких как аутентификация или настройки темы, но тщательное рассмотрение его компромиссов имеет важное значение.
favicon
dev.to
When NOT to Use `@EnvironmentObject` in SwiftUI
Create attached notes ...