Fragment 간의 이동 시 데이터 유지

Park Jae Hong·2022년 11월 27일
0

문제점


: 위 그림과 같이 장소 검색을 한후 전에 입력했던 값들이 유지 되어야 한다 !

처음 구현에는 Navigation Action을 통해 Fragment를 이동시켰는데, Action을 사용하게 되면 Fragment가 새로 생성 되기 때문에 값을 따로 관리해주어야 한다.


해결 방법

1. 현재 두개의 Fragment가 같은 Activity를 사용하고 있어, ActivityModel를 통해 데이터 공유

: Fragment 가 두 개의 ViewModel을 알고 있어야하고, Activity 가 살아있는 동안 activityViewModel이 계속 살아있다는 단점이 있다.

2. Sharedpreferences 에 모든 값을 저장해서 사용한다.

: 현재 Fragment의 값도 저장할 것이 많은데 다른 Fragment 까지 저장하게 된다면 OverFlow가 생길 수도 있음(탈락)

3. Navigation이 ViewModel(navGraphViewModels)을 따로 관리해 주고 있어서 이를 활용해 구현

: 일반 Text 값이라면 고정되어 있기때문에 사용할 수도 있겠지만 계속 변화하는 EditText 값을 계속 변경 시켜주기가 비효율 적이라고 판다.

최종 해결 방법

: Navigation Action을 통해 장소 검색 Fragment로 이동해도 이전 Fragment 가 사라지지 않고 BackStack에 Pause 상태로 저장된다는 사실을 알게 되었다. 그래서 BackStack을 잘 활용하면 EditText 등 데이터를 관리하지 않고 유지시킬 수 있지 않을까 생각하게 되었다.

구현내용
Send

// BackStack 할 떄, 값 보내기
findNavController().apply {
				// 이전으로 BackStack할때 값을 저장할 수 있는 함수 (주소 값과 위치 값을 저장)
                previousBackStackEntry?.savedStateHandle?.set(ADDRESS_KEY, address)
                previousBackStackEntry?.savedStateHandle?.set(LATLNG_KEY, markerState?.position)
                popBackStack()
            }

receive

// 저장된 값 받기
findNavController().currentBackStackEntry
            ?.savedStateHandle?.apply {
            	//LiveData를 Observing 하면서 값 변경 시 받아오기
                getLiveData<String>(ADDRESS_KEY).observe(viewLifecycleOwner) {
                    newChatViewModel.setAddress(it)
                }
                getLiveData<LatLng>(LATLNG_KEY).observe(viewLifecycleOwner) {
                    newChatViewModel.setLatLng(it)

                }
            }

code lab
참고 자료
공식 문서

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글