피드로 돌아가기
When using @State to modify a singleton instance, the UI cannot be refreshed.
Dev.toDev.to
Mobile

@State와 @Observed 조합으로 싱글톤 UI 갱신 문제 해결함

When using @State to modify a singleton instance, the UI cannot be refreshed.

HarmonyOS2026년 4월 3일3intermediate

Context

@State로 싱글톤 인스턴스를 감싸도 내부 속성 변경 시 UI가 갱신되지 않는 문제 발생함. @State는 변수 자체의 변경만 추적하고 클래스 인스턴스 내부 속성 변화는 감지하지 못함.

Technical Solution

  • @Observed 데코레이터: 싱글톤 클래스에 적용하여 인스턴스 내부 속성 변경을 감지 가능하게 함
  • AppStorage: 앱 레벨 상태 저장소로 인스턴스를 저장하여 페이지 간 데이터 공유 가능하게 함
  • @StorageLink: AppStorage에 연결된 변수를 선언하여 양방향 동기화 자동 수행함

Impact

Index 페이지와 Page2 사이에서 voiceReadHelper.isSpeaking 상태 변경 시 두 페이지 UI가 자동으로 동기화됨.

Key Takeaway

@State는 기본 타입 변수만 추적하며 클래스 인스턴스 내부 상태 변경은 감지하지 못함. 앱 전체에서 공유해야 하는 상태는 AppStorage와 @StorageLink 조합이 가장 효과적임.


싱글톤 패턴으로 만든 서비스 클래스에서 @State를 사용할 때는 @Observed 데코레이터를 클래스 선언부에 추가하거나, AppStorage.setOrCreate()로 인스턴스를 저장하고 @StorageLink로 바인딩해야 UI 변경이 정상 동작함.

원문 읽기