카테고리 없음
[Error] Perceptible state was accessed but is not being tracked
덤벨로퍼
2025. 1. 14. 21:49
SwiftUI TCA로 기능을 구현중이다.
아직 초보자 수준이라 매시간이 도전이고 고비다.
그러던중 이런 에러가 나타났다. 런타임에 발생하며 크래시는 안나지만
UI가 심하게 버벅이면서 에러가 자꾸 난다.
Perceptible state was accessed but is not being tracked.
Track changes to state by wrapping your view in a 'WithPerceptionTracking' view.
This must also be done for any escaping, trailing closures, such as 'GeometryReader',
`LazyVStack` (and all lazy views), navigation APIs ('sheet', 'popover',
'fullScreenCover', etc.), and others.
Swift5.9 에서 나온 Observation Tool 에 대응하기 위해
Perceptible 매크로가 TCA 1.7 에서 나왔다고 함
store 를 사용할때 이거를 사용함
@Perception.Bindable var store: StoreOf<MyProfileUpdateNameReducer>
이제 View 에서는
store 에서 상태값 불러오고 send action 같은 행위를 할텐데
properly observe changes to a “perceptible” model // WithPerceptionTracking
이거를 쓸때 WithPerceptionTracking 로 감싸서 쓰라고 함
그래서 가장 상위 뷰에 감싸줌
var body: some View {
WithPerceptionTracking {
....
근데 이게 아무리 감싸도 에러가 안사라짐
스유에는 많은 “lazy” closures 가 있음 ForEach 같이 excaping closure 에서 view 를 리턴하는것들을 말함
얘네들 쓸때 WithPerceptionTracking 로 감싸라고 함
ForEach(store.listItems, id: \\.self) { item in
WithPerceptionTracking {
MyView(item)..
}
}
이렇게 에러가 사라짐
또 개발하다 TextField 를 바인딩할 일이 있었는데
이 에러가 또 나타남 그래서 자신감있게 WithPerceptionTracking를 감싸줌
let text: Binding<String> // store 로 부터 세팅함
WithPerceptionTracking {
TextField(Localized.name, text: text) //
.frame(height: 48)
}
근데 에러가 안사라짐
상위 뷰에서 이렇게 바인딩 했었음
MyTextField(text: Binding(
get: { store.name },
set: { store.send(.inputName($0)) }
))
Binding() 에 get set 을 세팅해서 넘겨줬었음
지우고 넣고 아무리 해도 에러가 사라지지 않아
수소문 끝에 문제를 찾았는데 문제는 바인딩이었음
MyTextField(text: $store.name.sending(\\.inputName))
이런식으로 바인딩해야함
공식문서 참조