Navigator를 여러개를 쓰고있는 상태이다.
하위 Navigator에서 showDialog를 이용해 AlertDialog를 띄우는 상황에 action을 이용해 dialog와 dialog를 띄운 페이지를 pop을 하기위해 popUntil을 이용했다. (참고로 popUntil로 이동할 route의 이름은 route엔 존재하지 않음)
그리고 테스트를 하는데 화면이 갑자기 검게 변했다.
이 상태에서 핫 리로드를 수행해보면 아래와 같은 에러가 발생한다.
모든 화면이 pop되어 없는 상태여서 발생한 에러이다.
context를 통해 가까운 Navigator를 찾아 pop을 한다면 발생하지 않을 에러인데 발생해 이해할 수 없었다.
하위 Navigator의 initialRoute가 루트와 달라 아래 코드로 어떤 Navigator인지 알 수 있어 이를 print하며 찾던 중 root의 initialRoute가 나온 곳이 AlertDialog 위젯을 호출하는 곳이었다.
Navigator.of(context).widget.initialRoute
그래서 보게된 showDialog 내부 코드
범인이 여기있었다.
기본적으로 root Navigator를 쓰게 되어있었기에 당연한 것이었다.
원래 Navigator.of는 위와 같이 기본적으로 rootNavigator가 false로 되어있어 하위 context를 기준으로 찾는 것인데 showDialog가 true를 넣어줘서 root의 Navigator를 가져온 것이었다.
showDialog의 useRootNavigator를 false로 주어 문제를 해결했다.
편안
'개발 > Flutter' 카테고리의 다른 글
[Error] dependOnInheritedWidgetOfExactType<MediaQuery>() or dependOnInheritedElement() was called before initState() completed. (0) | 2022.07.03 |
---|---|
ScrollView내의 google map 스크롤 가능하게 설정 (0) | 2022.07.02 |
MultipartRequest의 response 처리 (0) | 2022.06.28 |
Row, Column 위젯 background 변경 (0) | 2022.06.15 |
[Navigator] popUntil (0) | 2022.06.14 |