기존의 코드

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를 생성해 사용하는 방법을 구현해보았다!

1️⃣ MapView 생성

변경한 코드