인프런 커뮤니티 질문&답변

유하님의 프로필 이미지
유하

작성한 질문수

Flutter 앱 개발 실전

Provider 이론2

provider에서 read를 사용

해결된 질문

작성

·

72

1

image.png

안녕하세요 선생님

선생님께서 올려주신 사진에 context.read()를 쓰셨는데

context.watch()를 써야 하는거 아닌가? 해서요

notifyListener()에 의해서 --> 반응하여 badge 함수가 불리는 거면

일회용인 read가 아닌 watch가 적절하지 않나 싶어서요...

명쾌한 답변 부탁드립니다 ㅎㅎ! 감사합니다..!

답변 1

1

DevStory님의 프로필 이미지
DevStory
지식공유자

안녕하세요 유하님

MyBadge 내부에서 addListener로 변경사항을 청취하기 때문에 read로 1회성 접근을 하셔도 됩니다.

또한 해당 위치는 InheritedWidget의 라이프사이클상 context.watch()로 접근할 수 없는 위치라서 read로만 접근할 수 있습니다.

감사합니다 🙂

유하님의 프로필 이미지
유하
질문자

InheritedWidget의 라이프사이클상 context.watch()로 접근할 수 없는 위치가 이해가 조금 안갑니다 ㅠㅠㅠ

우선 제가 이해한건 provider패키지는 내부적으로 InheritedWidget을 사용하여 상태관리를 구현했기 때문에 InheritedWidget 라이프사이클을 고려해야 한다는 거랑

context.read는 build 메서드 외부에서 주로 사용

context.watch는 주로 build 메서드 내에서 사용한다 이정도입니다.

DevStory님의 프로필 이미지
DevStory
지식공유자

Provider 코드 상에 주석으로 적혀있는 부분을 보시면, context.watch()는 StatelessWidget이나 StatefulWidget의 build 함수에서만 접근 가능하다고 적혀있습니다.
read와 달리 watch에만 이러한 제약 조건이 있는 원인은 내부적으로 InheritedWidget을 사용하는데, watch의 경우 접근하는 위젯이 위젯 트리에 등록된 뒤에만 InheritedWidget에 listener로 등록 가능하기 때문으로 이해하시면 될 것 같습니다.

유하님의 프로필 이미지
유하
질문자

넵 감사합니다 선생님 ~!

유하님의 프로필 이미지
유하

작성한 질문수

질문하기