seong

Flutter The following assertion was thrown building Builder: dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _Home.initState() completed. 본문

Flutter/Errors

Flutter The following assertion was thrown building Builder: dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _Home.initState() completed.

hyeonseong 2024. 6. 24. 10:12

Flutter 에서 개발 하던 도중 아래 에러 발생.

The following assertion was thrown building Builder: 
dependOnInheritedWidgetOfExactType<_LocalizationsScope>()
or dependOnInheritedElement() was called before _Home.initState() completed.

 

원인 

간략하게만 살펴보면 다음과 같다.

home의 initState가 끝나기도 전에 context를 사용 하려고 해서 그렇다

 

HomeScreen에서 최초 한번만 실행 하는 dialog가 필요 했는데, 이 부분을 아무 생각 없이 initState()함수에 넣었다.

Dialog에는 파라미터로 context가 필요했고, 그래서 에러가 발생했다.

 

해결 방안

initState -> didChangeDependencies 함수에 넣어주었다.

didChangeDependencies는 부모 위젯의 종속성이 변경 될 때마다 호출 된다, 이 부분에서 조금 조심 해야하는데 

이 말은 Screen1 -> Screen2 인 상황일때 Screen2에서 1의 Data를 종속 받아 사용하는데, 변경이 생기면 Screen2의 didChangeDependencies가 호출 된다는 뜻이다. 

 

나는 넣으려는 위젯이 제일 상위에 있는 부모 위젯이라 그냥 사용을 했다.

 

문제가 되는 initState부분

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
	...
    Prefs().getFirstLoginCheck.then((value) {
      if (!value) {
        _showBottomSheet();
      }
    });
  }

 

 

수정

  @override
  void didChangeDependencies() {
    /// _showBottomSheet에서  context가 필요하기 때문에 init 함수에서 사용이 불가능함.
    Prefs().getFirstLoginCheck.then((value) {
      if (!value) {
        _showBottomSheet();
      }
    });

    super.didChangeDependencies();
  }