RSS DEV 커뮤니티

SwiftUI에서 '@EnvironmentObject'를 사용하지 말아야 할 때는

@EnvironmentObject는 ObservableObject 프로토콜을 준수하는 공유 데이터에 접근하기 위한 SwiftUI 속성 래퍼입니다. 이 래퍼는 객체를 환경에 주입하여 하위 뷰가 명시적인 전달 없이도 해당 객체에 접근할 수 있도록 합니다. 객체 내에서 published 속성이 변경되면 관찰 중인 뷰가 다시 렌더링됩니다. 하지만 중요한 단점은 환경에서 객체를 찾을 수 없는 경우 런타임에 앱이 충돌한다는 것입니다. 이는 재사용 가능한 컴포넌트나 뷰를 격리하여 테스트할 때 자주 발생합니다. @EnvironmentObject는 몇몇 뷰에서만 종속성이 필요한 경우 적합하지 않습니다. 명시적인 매개변수를 사용하면 종속성을 명확하게 나타낼 수 있기 때문입니다. 재사용 가능한 컴포넌트의 경우, 이식성과 테스트 가능성을 유지하기 위해 초기화자나 클로저를 통해 명시적인 종속성을 사용하는 것이 좋습니다. 명시적인 종속성을 사용하면 각 테스트마다 전체 환경을 설정할 필요 없이 뷰를 훨씬 쉽게 테스트할 수 있습니다. @EnvironmentObject는 객체가 항상 존재한다고 가정하므로 조건부 종속성을 처리하는 데에도 불편함이 있습니다. @EnvironmentObject를 사용하여 NavigationLink 목적지로 데이터를 전달하면 미묘한 런타임 충돌과 DI 전략과의 긴밀한 결합을 초래할 수 있습니다. 세분화된 관찰 또한 문제입니다. published 속성이 변경될 때마다 모든 관찰 뷰가 다시 평가되기 때문입니다. 미리 보기도 환경 객체를 반복적으로 주입해야 하므로 번거로워집니다. 대안으로는 명시적인 초기화자 매개변수, 액션을 위한 클로저, 소유 상태를 위한 @StateObject, 보다 효율적인 관찰을 위한 @Observable, 기본값을 가진 사용자 정의 EnvironmentKeys 등이 있습니다. @EnvironmentObject는 인증 또는 테마 설정과 같이 진정으로 앱 전체에 적용되는 문제에 유용하게 사용될 수 있지만, 그 장단점을 신중하게 고려하는 것이 중요합니다.
favicon
dev.to
When NOT to Use `@EnvironmentObject` in SwiftUI
Create attached notes ...