❗비상비상

기존에는 Room에서 Flow를 반환하면 해당 entity의 변화가 있을 때 자동으로 update 된 객체를 전달해주었다. (ex: 저장하고 다시 불러올 필요가 없었음 자동으로 collect해서 업뎃해줌)

그러나! 모먼트 리스트를 가져오는 부분에서 페이징 라이브러리를 사용하다보니 Flow가 아닌 PagingSource를 반환해주고 PagingData를 Flow로 감싸서 전달해준다.

그렇기 때문에 entity의 변동사항을 Room에서는 알 수 없는 것!

큰일이다 큰일

이거이거 모먼트 남길 때 마다 업데이트 해주는 로직이 있어야하나?

물론 있어야겠지

하지만 onCreateView or onViewCreated 에 해당 로직이 있으면 fragment가 계속 전환되는(replace) Navigation component 특성 상 계속 불필요한 업데이트가 있을 수도 있다!!!!!!!!!!!!!!!!!!!!!!!

큰일이다 큰일

그렇다면 생각해볼 수 있는게 모먼트를 남길 때 이벤트를 주어서 홈 화면에서 변경되도록 구현해야한다. (사실상 viewModel에만 접근하면 된다. 굳이 홈 화면 fragment에 접근할 필요가 없음)

모먼트 남기기 부분에서 MapViewModel에 있는 fetchMoments 에 접근하는 것도 의존 관계를 가지기 때문에 애매하다.

브로드캐스트 리시버를 활용할 수도 있다. 모먼트 남기기를 눌렀을 때 이벤트를 예약해두고 설정해둔 특정 화면에 도달하면 로직을 실행할 수 있는 방법도 있다. flow를 모르던 시절 자주 사용하던 방식이었다.

그래도 더 좋은 방법이 있겠지 하고 더 찾아보니까 popBackStack을 할 때 이전 화면으로 상태를 전달해줄 수 있는 API가 존재했다. 모먼트 남기기 이전 fragment는 main 화면이기 때문에 해당 navigation component 속성을 활용하면 된다.

private fun updateMoments() {
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Boolean>("isUpdated")
        ?.observe(viewLifecycleOwner) { isUpdated ->
            if (isUpdated) {
                viewModel.fetchMoments()
            }
        }
}

isUpdated 라는 키를 가진 상태가 들어올 때 옵저빙하여 해당 로직을 실행한다.