티스토리 뷰

문제상황

Flutter에서 initState() 내에서 ref.watch() 또는 context.watch()와 같은 메서드를 사용하여 상태를 구독하려고 하면 문제가 발생한다. 이러한 호출은 initState()의 수명 주기 동안 컨텍스트가 아직 완전히 구성되지 않은 상태에서 발생하기 때문이다.

 

에러메세지

원인

  • initState()는 위젯의 수명 주기 중에 한 번만 호출된다.
  • initState()는 위젯의 컨텍스트가 완전히 형성되기 전에 호출된다.
  • InheritedWidget 또는 Provider의 값에 초기화 도중에 의존하려고 시도하면 위에서 언급한 문제가 발생한다.

해결책

  1. initState() 내부의 ref.watch() 또는 context.watch() 호출을 제거후에,
  2. didChangeDependencies() 메서드를 오버라이드한다. 이 메서드는 initState() 직후와 위젯의 종속성이 변경될 때마다 호출된다.
  3. didChangeDependencies() 내부에서 필요한 구독 업데이트를 수행한다.

 

해결책 요약

    @override
  void initState() {
    // TODO: implement initState
    super.initState();
    ref.watch(noticeProvider.notifier).getDetail(id: widget.id);
  } 이렇게 되있는걸
  
  ----------------------------------------------------------------
  
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    ref.watch(noticeProvider.notifier).getDetail(id: widget.id);
  } 이렇게 바꾸자

 

 

이렇게 하면 didChangeDependencies()는 initState() 이후에 호출되며, 위젯의 종속성이 변경될 때마다 필요한 구독 업데이트가 제대로 수행된다.

주의 사항

didChangeDependencies()는 여러 번 호출될 수 있으므로, 한 번만 실행되어야 하는 로직이 포함되어 있다면 플래그(_isInit 등)를 사용하여 첫 호출에서만 실행되도록 관리해야 한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함