[TIL] BackStack State Handle

박봉팔·2024년 2월 2일
0

BackStack(2)

어제 화면전환을 위해 BackStackBackStack Entry에 대해 알아보았다.
이제 전환되기 이전의 화면을 prevBackStackEntryDestination을 활용해 알아볼 수 있게 되었다.

하지만 문제가 생겼는데, prevBackStackEntry의 경우 popback메서드를 사용해 복귀할 경우 BackStack에 있던 Entry가 삭제되기 때문에 현재 BackStack에 있는 이전 Entry를 불러왔다.
(popBack으로 돌아온 이전 FragmentEntry가 없음)

따라서 popBack메서드를 사용해 화면을 전환해 돌아올 경우 이전의 화면이 어떤 화면이었는지 알기위해 다른 방법을 사용해야했다.


State Handle

이러한 문제를 이미 겪었기때문인지 BackStack에는 또 다른 방법으로 이전 Fragment의 정보를 저장하는 방법이 있다.

바로 State Handle을 저장하는 방법인데, popBack메서드를 실행하기전 현재 상태를 핸들에 저장해서 확하는 방법이다.

popBack으로 화면을 전환하기 전에 getBackStackEntry메서드를 사용해 이동하려는 대상의 Entry를 불러온다.

그 후 해당 EntrysavedStateHandle를 사용해 Key - Value로 현재 Fragment의 정보를 담아준다.

val nav = navHost.navController.
// saveStatHandle에 "prev_frag"를 키값으로 현재 프래그먼트 ID를 추가해준다
nav.getBackStackEntry(R.id.menu_search).savedStateHandle.set("prev_frag", R.id.menu_my_storage)
nav.popBackStack()

이제 해당 프래그먼트의 EntrystateHandle에는 "prev_frag"라는 키값으로 현재 FragmentID가 들어있기 때문에 현재 FragmentEntry를 불러온뒤 stateHandle에 있는 "prev_frag"value를 확인하면 이전 프래그먼트를 알아낼 수 있다.

 val prevId = findNavController().currentBackStackEntry?.savedStateHandle?.get<Int>("prev_frag")
 
if (prevId == null) {
	binding.etSearchBar.requestFocusAndKeyboardShow()
}

이후 해당 ID값을 원하는 FragmentID값과 비교해서 원하는 행동을 하면 된다.


오늘은 어땠나요?

그래도 자잘하게 원하는 것들을 만들어 보았다.

생각보다 잘돼서 기분이 좋다.

profile
개발 첫걸음! 가보자구!

0개의 댓글