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:12Flutter 에서 개발 하던 도중 아래 에러 발생.
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();
}