본문 바로가기
프로그래밍/Jetpack Compose

[Jetpack Compose] Navigation PopBackStack 반복 실행 시 빈 화면이 나오던 문제

by dev_gyu 2024. 9. 24.
728x90
  • 보통 우리가 컴포즈를 사용할때는 NavHost 라는 것을 활용해서 여러 컴포저블로 Srceen을 구현하고, NavController 의 Navigate를 사용해 Srceen을 이동하면서 사용한다.
  • 이 사이에서 가장 많이 사용되는것은 단연코 NavController 이다. 이것의 기능은 여러가지이지만, 지금은 Stack 관련해서만 작성할 예정.

NavController.popBackStack

  • 쉽게 알다시피 뒤로가기 기능과 동일한 작업을 한다.
  • BackQueue 에 Stack이 쌓이고, popBackStack을 호출하면 최상위 Stack 부터 차례대로 pop 하면서 스크린을 뒤로 가게 해준다.

하지만 이 부분에는 약간의 문제가 존재한다.

  • Navigate 시 컴포즈는 이동되는 화면을 Stack 에 바로 쌓아버리기 때문에, A → B로 이동시 BackQueue 에는 1. A 2. B 순으로 쌓인다.
  • 그리고 NavController.popBackStack 은 BackQueue 가 존재하면 해당 화면을 Queue 에서 Pop을 해버리기 때문에 해당 화면이 StartDestination 이 아닐 경우 화면을 pop해버린다.
  • 나의 경우 문제가 StartDestination 화면에서 Navigate 시 popUpTo 로 해당 스크린 지움 → 상위 스크린 A, B, C .. 여러 번 이동 → 뒤로가기 이미지 연타로 popBackStack 하는데 자꾸 빈 화면이 나오는 문제가 있었다. 빈 화면이 나오는 이유는 아래와 같았다.

 

그래서 만약 popBackStack으로 인한 무언가의 버그가 생기면 이 점을 확인해보고, previousBackStackEntry 가 null 일 경우에만 popBackStack() 이 되도록 수정해보자

주의할 점

  • StartDestination으로 설정한 Route의 경우 Navigate 시 popUpTo에 지정해줘도 BackStackEntry 에서 살아남는다. 이유는 아래와 같았다.
 
 
728x90