NaverMap SDK를 사용해서 지도 기능을 구현하고 있다.
우리 프로젝트는 공식 문서를 참고해서 구현한 결과 MapFragment를 사용하고 있었다.
기존 코드
AndroidView를 사용해서 FragmentContainerView를 만들고 Fragment를 생성한다.
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
FragmentContainerView(context).apply {
id = View.generateViewId()
(context as FragmentActivity).supportFragmentManager.beginTransaction()
.replace(id, NaverMapFragment())
.commitAllowingStateLoss()
}
}
)
하지만 내부에서 id = View.generateViewId()
를 통해 View의 Id를 계속 생성하고 있기 때문에, recomposition이 발생할 때마다 새로운 id의 MapFragment가 만들어지는 문제가 발생했다.
이로 인해, viewModel을 통해 이벤트를 처리하고 있었는데 클릭을 한 번 할때마다 생성된 여러개의 Fragment에서 해당 이벤트를 collect하는 문제도 함께 발생했다.
id가 재생성되지 않도록 고정값으로 설정한다면 Fragment가 재생성되지 않았다.
하지만, 근본적으로 FragmentContainerView 내부에 MapFragment를 또 만드는 방법이 최선일까? 굳이 그래야할까? 라는 의문이 제시되었다.
그래서 MapFragment를 제거하고, MapView를 생성해 사용하는 방법을 구현해보았다!
변경한 코드