fornewid / naver-map-compose

NAVER Map Android SDK for Jetpack Compose 🗺
https://fornewid.github.io/naver-map-compose/
Apache License 2.0
115 stars 7 forks source link

Marker redraw failed with new latlng, and remained #50

Closed greatm84 closed 1 year ago

greatm84 commented 1 year ago

안녕하세요 만들어주신 naver map sdk 잘 사용하고 있습니다

location item들을 param으로 받는 composable function 내부에 NaverMap compose 호출을 통해 처음 marker가 있는 화면을 그린 뒤(marker는 location 을 position 및 key로 사용) app을 pause 후 resume 하고 나서

location param을 변경하여 navermap을 감싸는 composable function 이 다시 호출되었을때 이전 marker들은 이전 위치에 그대로 남아있고 새로운 position에 맞는 marker들이 생성되진 않습니다 새로운 position에 맞게 그려져야 할 것 같습니다

PathOverlay는 정상적으로 새롭게 그려집니다(rememberSaveable이 아니기도 해서 그렇겠지요)

ex)
@OptIn(ExperimentalNaverMapApi::class)
@Composable
fun DrawMap(
    cameraPositionState: CameraPositionState,
    remainItems: List<LocationItem>
) {
    NaverMap(cameraPositionState = cameraPositionState) {
        val width = dimensionResource(R.dimen.path_overlay_width)
        if (remainItems.size >= 2) {
            PathOverlay(
                coords = remainItems.reversed().map { locationToLatLng(it) },
                width = width,
                outlineWidth = 0.dp,
                color = Color(0xFF7777FF),
                patternImage = OverlayImage.fromResource(R.drawable.small_wide_footprints),
                patternInterval = dimensionResource(R.dimen.overlay_pattern_interval),
            )
        }
        DrawMarkers(remainItems)
    }
}

@OptIn(ExperimentalNaverMapApi::class)
@Composable
fun DrawMarkers(items: List<LocationItem>) {
    items.forEachIndexed { index, locationItem ->
        Marker(
            state = rememberMarkerState(
                key = "$index $locationItem", // key가 있든 없든 문제는 재현됩니다
                position = LatLng(
                    locationItem.latitude.toDouble(),
                    locationItem.longitude.toDouble()
                )
            ),
            captionText = locationItem.convertTime(),
            globalZIndex = MARKER_OVERLAY_Z_INDEX_FROM - index,
            captionTextSize = 10.sp,
            isHideCollidedMarkers = true,
        )
    }
}

이슈인 것 같아 리포팅 해드립니다

혹시 제가 잘못 사용하고 있는 부분에 의해 발생하고 있는 이슈라면 수정할 부분이 있다면 알려주시면 매우 감사하겠습니다

greatm84 commented 1 year ago

아래와 같이 하면 잘됩니다 물론 그냥 remember을 사용한거라 화면 회전이나 앱 디스플레이 동적 사이즈 변경에 대응은 안되겠지만요.

@ExperimentalNaverMapApi
@Composable
@NaverMapComposable
public fun rememberMarkerState2(
    key: String? = null,
    position: LatLng = LatLng(0.0, 0.0),
): MarkerState = remember(key1 = key, key2 = position) {
    MarkerState(position)
}
fornewid commented 1 year ago

@greatm84 우선 이슈 등록해주셔서 감사합니다. :)

rememberMarkerState()는 하나의 옵션으로 제공되는 API라서, 반드시 사용할 필요는 없구요. 아래처럼 MarkerState를 바로 생성하셔도 될 것 같습니다.


    items.forEachIndexed { index, locationItem ->
        Marker(
-           state = rememberMarkerState(
-               key = "$index $locationItem", // key가 있든 없든 문제는 재현됩니다
+           state = MarkerState(
                position = LatLng(
                    locationItem.latitude.toDouble(),
                    locationItem.longitude.toDouble()
                )
            ),
            captionText = locationItem.convertTime(),
            globalZIndex = MARKER_OVERLAY_Z_INDEX_FROM - index,
            captionTextSize = 10.sp,
            isHideCollidedMarkers = true,
        )
    }

rememberMarkerState() 동작 수정은 고민해보겠습니다. 🤔

greatm84 commented 1 year ago

넵 좋은 답변 감사드립니다. 유용하게 잘 쓰고 있어요 b

fornewid commented 1 year ago

@greatm84 이슈 많이 올려도 괜찮으니, 자유롭게 올려주세요. :bow: